在MVC 5中怎么将Moq添加到项目mvc4 单元测试试中

[翻译]在ASP.NET MVC中使用TDD与依赖注入 - 郁闷的PP - 博客园
(代码截图为ASP.NET MVC Preview 5版本)
原文地址:
在设计ASP.NET MVC Framework的时候,指导原则之一是要能使用TDD(测试驱动开发)建立web应用程序。本文使用ASP.NET MVC CodePlex Preview 4为例(经过测试,代码可以在Preview 5中运行,翻译版截图全部为Preview 5),我将试着保持这篇文章的内容适用于最新的ASP.NET MVC Framework,但是需要多一点点的时间。
本文提供一个稍具测试驱动开发(TDD)风格的web程序,同时介绍把 DI()框架集成到这个ASP.NET MVC示例中。在本文结尾处你可以下载代码。
我选择了StructureMap 2.0依赖注入框架,因为我对它比较熟悉,并且它只需要做很少的代码和配置。如果你想把这个示例换成使用,可以到查看。以后我可能会写点使用和的代码示例。
Start Me Up!(向滚石乐队致歉)
首先安装好VS2008以及ASP.NET MVC,打开Visual Studio 2008并选择File|New Project,在对话窗口中选择ASP.NET MVC Application模板。
然后选择单元测试项目选择对话框。
默认安装下,只有Visual Studio Unit Test项目选项可用。但是安装了MbUnit,xUnit等等其他框架也会在这里显示出来。
你可能会猜想,我会从建立一个很权威的blog例子,其实我会从没有数据库的示例开始,我们可以以后慢慢添加。
第一件我想做的事是添加一些类文件到主项目中去。我不会添加任何实现,能编译就行。我首先添加这些:
在Controllers目录下BlogController.cs
在Models目录下IPostRespository.cs
在Models目录下Post.cs
在MvcApplicationTest项目下BlogControllerTests
完成后,我的项目文件树像这样:
现在我想写足够多的代码让我们可以写一个测试。首先,我定义了容器接口。
对真正的博客帖子容器来说这点内容是不够的,但是这里只是做一个demo而已。当你准备好写一个很强悍的blog引擎的时候,你可以添加更多的方法。
现在我仍然不管Post类,让它继续空着,可以以后再来实现。先实现blog的Controller。
好了,在这里打住。我们已经能够开始写单元测试了。毕竟我准备演示TDD嘛。让我们先来写个测试。
Let’s Get Test Started, In Here.(向黑眼豆豆致歉)
从最简单的测试开始,确定Recent这个行为(Action)没有指定视图(View),因为我看到默认行为的运行结果。(这段代码假设你已经引用了所有需要的名称空间)
运行这个测试,会失败。
但这正是我们所期望的,因为我们并没有实现Recent方法。这是TDD红绿重构韵律之红色部分。
还是让我们来把这个方法实现了吧:
注意:我们是把精力集中在行为上,而不是在UI上。这和使用ASP.NET WebForms是不同的。这两者没有孰优孰劣,只是风格不同而已。
现在当我运行测试,会通过。
很好,现在是TDD生命周期的绿色部分了!也只个非常非常简单的TDD例子。现在该我们进入介绍依赖注入阶段了。
It’s Refactor Time(向读者致歉,扯得太远了)
为了获得最近的博客帖子,我想为我的博客Controller提供一个“服务”实例,它可以请求这些帖子。
这时,我不能确定我怎么去存储博客帖子,用什么好呢?SQL?XML?还是其他?
都不是。暂时不要去想它吧。
我们可以把这个讨论延迟到最后的时刻。现在我要创建一个抽象容器IPostRepository,用来描述我想怎么存储和取回这些博客帖子。我们来为blogController写些代码,让它可以在它的构造器中接受一个这个接口的实例。
这是依赖注入的依赖(Dependency)部分。这个Controller现在有一个对IPostResitory的依赖。注入(Injection)部分是一种机制:传递依赖给所需要依赖的类,直接创建类的实例,并绑定类到所指定的接口的实现。
现在修改BlogController类。
很好。注意我并没有改变Recent方法。我需要先写另一个测试,要确保它传递正确的数据给view。
注意:你现在会发现刚才我们写的测试不能通过,先注释掉,我们一会再修正它。
我们现在要使用mock框架,在我写测试之前,我需要引用Moq.dll到我的测试项目中,在这里下载。
注意:在本示例项目中已经引用了这个程序集。
这个测试动态创建IPostRepository接口的实现。我们告诉它:不管是什么参数传递给了ListRecentPosts,返回两篇帖子。
注意:我们现在不需要这个接口的实现。我们感兴趣的是把测试Action的逻辑孤立出来,所以在测试的时候我们直接使用了接口实例化。
开始测试,失败了,看来我们需要重构Recent方法,让它正确运行:
重新测试一次,成功了!
Inject That Dependency
当我使用浏览器尝试访问这个action的时候(如http://localhost:14963/Blog/Recent),会出现如下的错误页面:
出现这样的错误很正常,默认情况下,ASP.NET MVC需要Controller有一个public的、无参的构造器,让它自己可以创建Controller的实例。但是我们的构造器需要一个IPostRepository实例作为参数。我们需要给Controller传递一个这样的参数才行。
StructureMap(或其他依赖注入框架)来救援!
注意:记得下载和引用StructureMap.dll程序集。我在示例代码中已经引用了。
首先要在应用程序根目录下创建StructureMap.config文件,文件内容:
这里不对这个文件内容做详细解释,如果你想了解更多,请查看StructureMap文档。
它只暴露了你所需要知道的最少细节,每个PluginFamily节点描述一个接口类型和一个节点的键(key)。Plugin节点描述一个具体的类型:框架实例化接口类型需要创建的具体类型。
比如说,第二个PluginFamily节点中,接口类型是IPostRepository,具体的类型是InMemoryPostRepository。当我们使用StructureMap构造一个包含对IPostRepository依赖的类型的实例时,StructureMap会传递一个InMemoryPostReposity实例。
平时我使用SqlPostRepository。但是这个demo的目的并不需要那么做,所以我打算用个静态集合,把存储这些博客帖子到内存中。我们总是可以不急着实现使用SQL版本。
注意:本来应该写一个InMemoryPostRepository的测试,但是这篇文章已经够长了。不过也别担心,我会把单元测试放到示例代码中去。
快,我们需要一个工厂!
快完成了。我们需要实现IControllerFactory接口,把StructureMap连接到ASP.NET MVC上。Controller工厂的职责是创建Controller的实例。我们可以在自己的工厂中用这些逻辑:
最后,我们吧他们都连接起来,在Global.asax.cs中的Application_Start方法添加方法调用:
一切搞定!现在我们把依赖注入框架引入到了我们的程序中,我们可以重新访问站点测试一下了(别忘记编译)。我们得到这个页面:
很好很强大!黄屏去死吧,不过在这里是个好现象:我们的依赖对象已经注入到对象中了,这是另一个错误提示,因为我们没有view创建view造成的。
不好意思,跑题了。
这里我就不做了,你们可以自己做一个,或者你们可以在傻瓜示例源代码中看到。
这个示例有点简单得可笑,不过这种原则在做更大的项目中也是通用的。它只是用来学习技术的,希望在你在TDD路上走得更好。
本文所有内容的(ASP.NET MVC Preview 5/StructureMap 2.0)。& & &单元测试虽然是个很老的东西了,但平时写代码一般都不写测试,因为调试完全可以满足了,所以一直也就没有用过,刚好在《》中看到了这个东西,于是就把自带的单元测试和也研究了一下。好吧,我们现在就开始吧。
& & &新建项目如下:
然后右键&&解决方案新建项目测试&:
为了与Domain保持一致,所以建完后如下:
测试结果如下:
public class Person
public string ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Job { get; set; }
IPersonProvider:
public interface IPersonProvider
Person GetPersonById(string id);
bool RemovePerson(string id);
PersonProviderTest:&
[TestMethod]
public void GetPersonByIdTest() {
//创建MOCK对象
var mock = new Mock&IPersonProvider&();
//设置MOCK调用行为
mock.Setup(foo=&foo.GetPersonById("1")).Returns(new Person());
//MOCK调用方法
mock.Object.GetPersonById("1");
Assert.AreNotSame(new Person(), mock.Object.GetPersonById("1"));
var mock1 = new Mock&IPersonProvider&();
mock1.Setup(foo =& foo.GetPersonById(It.IsAny&string&())).Returns(new Person());
Assert.AreNotSame(new Person(), mock1.Object.GetPersonById("aaa"));
[TestMethod]
public void RemovePersonTest()
var mock = new Mock&IPersonProvider&();
.Setup(foo =& foo.RemovePerson(It.Is&string&(s=&s=="1"||s=="2")))
.Returns(true);
Assert.AreEqual(true,mock.Object.RemovePerson("1"));
以上是在vs2012下作的测试,当然在vs2010下会有小许不同,vs2010在方法上是通过右键创建单元测试,而vs2012单独拿了出来放在新建项目中,vs2010要一个一个方法的进行测试,而vs2012可以一次全部运行测试,并且还可以设置&编译后自动运行测试,这是2012的亮点。当然,这篇文章只是对VS2012和MOQ做了一个简单的介绍而已,您还可以通过以下链接来加深对Moq的理解
阅读(...) 评论()濡備綍浣跨敤Moq鐨勬垜鐨凥ttpContext鍦ˋSP.NET MVC锛-c#,asp.net-mvc,mocking,moq,httpcontext-CodeGo.net
濡備綍浣跨敤Moq鐨勬垜鐨凥ttpContext鍦ˋSP.NET MVC锛
[TestMethod]
public void Home_Message_Display_Unknown_User_when_coockie_does_not_exist()
var context = new Mock&HttpContextBase&();
var request = new Mock&HttpRequestBase&();
.Setup(c =& c.Request)
.Returns(request.Object);
HomeController controller = new HomeController();
controller.HttpContext = //Here I am getting an error (read only).
鎴慴ase鎺у埗鍣ㄦ湁寰楀埌鐨勮繖涓猂equestContext鐨勫垵濮嬪寲鐨刼verrride銆傛垜鎯充竴璧蜂紶閫掞紝浣嗘垜涓嶈繖鏍峰仛鐨勬潈鍒┿
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
base.Initialize(requestContext);
鎴戝湪鍝噷鍙互寰楀埌鍦ㄦ垜鐨凴equestContext鐨勫拰moq锛熸垜璇曞浘鍢插紕cookie鍜屼竴鑸幆澧冦
鏈枃鍦板潃 锛欳odeGo.net/84744/
-------------------------------------------------------------------------------------------------------------------------
1. HttpContext鐨勬槸鍙鐨勶紝浣嗗畠瀹為檯涓婃槸浠嶤ontrollerContext锛屾偍鍙互璁剧疆瀵煎嚭銆
controller.ControllerContext = new ControllerContext( httpContext.Object, new RouteData(), controller );
鍒涘缓涓涓姹傦紝鍝嶅簲锛屽苟鎶婁粬浠袱涓殑HttpContext锛
HttpRequest httpRequest = new HttpRequest("", " CodeGo.net
StringWriter stringWriter = new StringWriter();
HttpResponse httpResponse = new HttpResponse(stringWriter);
HttpContext httpContextMock = new HttpContext(httpRequest, httpResponse);
涓嬮潰鏄浣曡缃繖涓涓緥瀛愶細鐨凥ttpContext鐨凥ttpRequest鍜孒ttpResponse瀵硅薄杩涜鍗曞厓娴嬭瘯锛堜娇鐢∕OQ锛
璇锋敞鎰忥紝杩欑‘瀹炴湁鍔╀簬绠鍖栬繖涓猰ocking绫伙細
var mockHttpContext = new API_Moq_HttpContext();
var httpContext = mockHttpContext.httpContext();
httpContext.request_Write("&html&&body&".line());
httpContext.request_Write(" this is a web page".line());
httpContext.request_Write("&/body&&/html&");
return httpContext.request_Read();
涓嬮潰鏄浣曠紪鍐欎竴涓崟浣峬oq鏉ユ鏌ョ殑HttpModule鎸夐鏈熷伐浣滅殑渚嬪瓙锛氬崟鍏冩祴璇曠殑璧疯閲忔潵鍖呰鐨凥ttpRequest
涓嬮潰鏄彲鑳藉畠澶勭悊Ajax璇锋眰锛岀敤鎴疯璇侊紝瑕佹眰鍜屾洿澶氱殑绫伙細
浠ヤ笅鏄浣曠殑ControllerContext閫氳繃鍋囩殑搴旂敤绋嬪簭璺緞锛
[TestClass]
public class ClassTest
private Mock&ControllerContext& mockControllerC
private HomeC
[TestInitialize]
public void TestInitialize()
mockControllerContext = new Mock&ControllerContext&();
sut = new HomeController();
[TestCleanup]
public void TestCleanup()
sut.Dispose();
mockControllerContext =
[TestMethod]
public void Index_Should_Return_Default_View()
// Expectations
mockControllerContext.SetupGet(x =& x.HttpContext.Request.ApplicationPath)
.Returns("/");
sut.ControllerContext = mockControllerContext.O
var failure = sut.Index();
Assert.IsInstanceOfType(failure, typeof(ViewResult), "Index() did not return expected ViewResult.");
鏈枃鏍囬 锛氬浣曚娇鐢∕oq鐨勬垜鐨凥ttpContext鍦ˋSP.NET MVC锛
鏈枃鍦板潃 锛欳odeGo.net/84744/
Copyright 漏 2014 CodeGo.net您好,欢迎来到北风网!
分享:999+
快速上手Extjs4.2并熟练搭建基于MVC4+FluentData+Spring.net和T4模板的企业级项目架构
普通会员:¥899元
VIP会员价:最低¥629元
课程讲师:闲筝
课程分类:.NET+ExtJs
适合人群:中级
课时数量:76课时
更新程度:完成
服务类型:D类(自学类课程)
用到技术:Extjs4.2,MVC4,FluentData,T4,Spring.net
涉及项目:基于Extjs4.2的丰富案例、一个独立的企业级架构和综合演示案例
北风网五级VIP会员(10T视...
440620人喜欢
深入浅出Hadoop实战开发(...
329233人喜欢
基于ASP.NET MVC+L...
222769人喜欢
Google Android移...
205894人喜欢
基于J2EE+JBPM3.x/...
197904人喜欢
李炎恢PHP第二季系列课程(配...
177576人喜欢
基于.net平台remotin...
176729人喜欢
基于J2EE平台下的strut...
159754人喜欢
北风网--asp.net版本文...
156847人喜欢
基于云计算Saas平台下的C2...
153490人喜欢
课程信息课程试看课程截图课程评论
看过本课程的学员还看了
普通会员:¥480.00
普通会员:¥1000.00
普通会员:¥380.00
普通会员:¥80.00
普通会员:¥240.00
普通会员:¥480.00
普通会员:¥680.00
普通会员:¥380.00
普通会员:¥480.00
普通会员:¥480.00
普通会员:¥240.00
普通会员:¥880.00
普通会员:¥1000.00
普通会员:¥480.00
普通会员:¥240.00
普通会员:¥480.00
普通会员:¥2400.00
普通会员:¥280.00
普通会员:¥2200.00
普通会员:¥240.00
普通会员:¥1200.00
普通会员:¥480.00
普通会员:¥580.00
普通会员:¥780.00
普通会员:¥1000.00
普通会员:¥880.00
普通会员:¥220.00
普通会员:¥500.00
普通会员:¥230.00
普通会员:¥280.00
普通会员:¥280.00
普通会员:¥480.00
普通会员:¥1000.00
普通会员:¥220.00
普通会员:¥1800.00
普通会员:¥1200.00
普通会员:¥280.00
普通会员:¥380.00
普通会员:¥780.00
普通会员:¥450.00
普通会员:¥3800.00
普通会员:¥180.00
普通会员:¥580.00
普通会员:¥480.00
普通会员:¥480.00
普通会员:¥480.00
普通会员:¥300.00
普通会员:¥280.00
普通会员:¥220.00
普通会员:¥280.00
普通会员:¥300.00
普通会员:¥60.00
普通会员:¥220.00
普通会员:¥240.00
普通会员:¥400.00
普通会员:¥680.00
普通会员:¥220.00
普通会员:¥280.00
普通会员:¥280.00
普通会员:¥580.00
普通会员:¥380.00
普通会员:¥220.00
普通会员:¥320.00
普通会员:¥480.00
普通会员:¥560.00
普通会员:¥1.00
普通会员:¥240.00
普通会员:¥240.00
普通会员:¥220.00
普通会员:¥400.00
普通会员:¥280.00
普通会员:¥400.00
普通会员:¥100.00
普通会员:¥380.00
普通会员:¥300.00
普通会员:¥240.00
普通会员:¥480.00
普通会员:¥380.00
普通会员:¥680.00
普通会员:¥240.00
普通会员:¥240.00
普通会员:¥280.00
普通会员:¥480.00
普通会员:¥68.00
普通会员:¥480.00
普通会员:¥380.00
普通会员:¥260.00
普通会员:¥2060.00
普通会员:¥580.00
普通会员:¥580.00
普通会员:¥480.00
普通会员:¥480.00
普通会员:¥240.00
普通会员:¥400.00
普通会员:¥580.00
普通会员:¥280.00
普通会员:¥480.00
普通会员:¥280.00
普通会员:¥240.00
普通会员:¥240.00
普通会员:¥1400.00
普通会员:¥280.00
普通会员:¥480.00
普通会员:¥480.00
普通会员:¥380.00
普通会员:¥386.00
普通会员:¥59.00
普通会员:¥400.00
普通会员:¥600.00
普通会员:¥300.00
普通会员:¥380.00
普通会员:¥380.00
普通会员:¥580.00
普通会员:¥580.00
普通会员:¥400.00
普通会员:¥150.00
普通会员:¥480.00
普通会员:¥50.00
普通会员:¥60.00
普通会员:¥2800.00
普通会员:¥480.00
普通会员:¥480.00
普通会员:¥240.00
普通会员:¥150.00
普通会员:¥280.00
普通会员:¥240.00
普通会员:¥320.00
普通会员:¥280.00
普通会员:¥240.00
普通会员:¥380.00
普通会员:¥180.00
普通会员:¥280.00
普通会员:¥40.00
普通会员:¥35.00
普通会员:¥35.00
普通会员:¥280.00
普通会员:¥360.00
普通会员:¥45.00
普通会员:¥280.00
普通会员:¥240.00
普通会员:¥180.00
普通会员:¥220.00
普通会员:¥1600.00
普通会员:¥880.00
普通会员:¥4800.00
普通会员:¥220.00
普通会员:¥240.00
普通会员:¥400.00
普通会员:¥380.00
普通会员:¥220.00
普通会员:¥680.00
普通会员:¥300.00
普通会员:¥220.00
普通会员:¥280.00
普通会员:¥220.00
普通会员:¥240.00
普通会员:¥220.00
普通会员:¥580.00
普通会员:¥220.00
普通会员:¥240.00
普通会员:¥360.00
普通会员:¥280.00
普通会员:¥280.00
普通会员:¥380.00
普通会员:¥3800.00
普通会员:¥320.00
普通会员:¥800.00
普通会员:¥280.00
普通会员:¥280.00
普通会员:¥1000.00
普通会员:¥600.00
普通会员:¥880.00
普通会员:¥1800.00
普通会员:¥1800.00
普通会员:¥2000.00
普通会员:¥1000.00
普通会员:¥1000.00
普通会员:¥1500.00
普通会员:¥680.00
普通会员:¥1600.00
普通会员:¥1500.00
普通会员:¥1000.00
普通会员:¥780.00
普通会员:¥580.00
普通会员:¥400.00
普通会员:¥120.00
普通会员:¥400.00
普通会员:¥320.00
普通会员:¥500.00
普通会员:¥240.00
普通会员:¥280.00
普通会员:¥680.00
普通会员:¥400.00
普通会员:¥400.00
普通会员:¥280.00
普通会员:¥380.00
普通会员:¥240.00
普通会员:¥480.00
普通会员:¥1000.00
普通会员:¥580.00
普通会员:¥220.00
普通会员:¥360.00
普通会员:¥580.00
普通会员:¥680.00
普通会员:¥380.00
普通会员:¥680.00
普通会员:¥580.00
普通会员:¥880.00
普通会员:¥300.00
普通会员:¥240.00
普通会员:¥580.00
普通会员:¥380.00
普通会员:¥240.00
普通会员:¥240.00
普通会员:¥380.00
普通会员:¥240.00
普通会员:¥380.00
普通会员:¥240.00
普通会员:¥220.00
普通会员:¥220.00
普通会员:¥580.00
普通会员:¥280.00
普通会员:¥450.00
普通会员:¥480.00
普通会员:¥220.00
普通会员:¥680.00
普通会员:¥880.00
普通会员:¥400.00
普通会员:¥280.00
普通会员:¥380.00
普通会员:¥60.00
普通会员:¥240.00
普通会员:¥50.00
普通会员:¥300.00
普通会员:¥380.00
普通会员:¥280.00
普通会员:¥480.00
普通会员:¥240.00
普通会员:¥240.00
普通会员:¥380.00
普通会员:¥280.00
普通会员:¥60.00
普通会员:¥480.00
普通会员:¥240.00
普通会员:¥180.00
普通会员:¥30.00
普通会员:¥59.00
普通会员:¥1380.00
普通会员:¥360.00
普通会员:¥240.00
普通会员:¥580.00
普通会员:¥380.00
普通会员:¥70.00
普通会员:¥380.00
普通会员:¥30.00
普通会员:¥220.00
普通会员:¥280.00
普通会员:¥280.00
普通会员:¥220.00
普通会员:¥70.00
普通会员:¥880.00
普通会员:¥70.00
普通会员:¥580.00
普通会员:¥220.00
普通会员:¥85.00
普通会员:¥59.00
普通会员:¥300.00
普通会员:¥50.00
普通会员:¥380.00
普通会员:¥300.00
普通会员:¥220.00
普通会员:¥40.00
普通会员:¥40.00
普通会员:¥240.00
普通会员:¥80.00
普通会员:¥40.00
普通会员:¥60.00
普通会员:¥240.00
普通会员:¥280.00
普通会员:¥300.00
普通会员:¥380.00
普通会员:¥680.00
普通会员:¥280.00
普通会员:¥480.00
普通会员:¥55.00
普通会员:¥680.00
普通会员:¥240.00
普通会员:¥240.00
普通会员:¥580.00
普通会员:¥220.00
普通会员:¥280.00
普通会员:¥500.00
普通会员:¥360.00
普通会员:¥240.00
普通会员:¥280.00
普通会员:¥80.00
普通会员:¥60.00
普通会员:¥580.00
普通会员:¥380.00
普通会员:¥280.00
普通会员:¥240.00
普通会员:¥1800.00
普通会员:¥280.00
普通会员:¥480.00
普通会员:¥350.00
普通会员:¥220.00
普通会员:¥360.00
普通会员:¥50.00
普通会员:¥50.00
普通会员:¥220.00
普通会员:¥35.00
普通会员:¥380.00
普通会员:¥300.00
普通会员:¥400.00
普通会员:¥280.00
普通会员:¥180.00
普通会员:¥220.00
普通会员:¥4200.00
普通会员:¥240.00
普通会员:¥220.00
普通会员:¥400.00
普通会员:¥60.00
普通会员:¥580.00
普通会员:¥60.00
普通会员:¥480.00
普通会员:¥180.00
普通会员:¥280.00
普通会员:¥220.00
普通会员:¥180.00
普通会员:¥400.00
普通会员:¥240.00
普通会员:¥6.00
普通会员:¥580.00
普通会员:¥2000.00
普通会员:¥580.00
普通会员:¥3000.00
普通会员:¥650.00
普通会员:¥580.00
普通会员:¥880.00
普通会员:¥580.00
普通会员:¥1200.00
普通会员:¥600.00
普通会员:¥580.00
普通会员:¥480.00
普通会员:¥1260.00
普通会员:¥800.00
普通会员:¥580.00
普通会员:¥480.00
普通会员:¥480.00
普通会员:¥780.00
普通会员:¥780.00
普通会员:¥580.00
普通会员:¥880.00
普通会员:¥1200.00
普通会员:¥0.00
普通会员:¥1800.00
普通会员:¥880.00
普通会员:¥880.00
普通会员:¥480.00
普通会员:¥480.00
普通会员:¥880.00
普通会员:¥400.00
普通会员:¥880.00
普通会员:¥1080.00
普通会员:¥1680.00
普通会员:¥880.00
普通会员:¥1280.00
普通会员:¥880.00
普通会员:¥1280.00
普通会员:¥1200.00
普通会员:¥580.00
普通会员:¥880.00
普通会员:¥0.00
普通会员:¥1000.00
普通会员:¥380.00
普通会员:¥1680.00
普通会员:¥2000.00
普通会员:¥3800.00
普通会员:¥1000.00
普通会员:¥800.00
普通会员:¥580.00
普通会员:¥580.00
普通会员:¥480.00
普通会员:¥880.00
普通会员:¥2100.00
普通会员:¥580.00
普通会员:¥480.00
普通会员:¥980.00
普通会员:¥260.00
普通会员:¥0.00
普通会员:¥1000.00
普通会员:¥1000.00
普通会员:¥380.00
普通会员:¥480.00
普通会员:¥680.00
普通会员:¥880.00
普通会员:¥480.00
普通会员:¥3800.00
普通会员:¥880.00
普通会员:¥880.00
普通会员:¥499.00
普通会员:¥488.00
普通会员:¥488.00
普通会员:¥598.00
普通会员:¥900.00
普通会员:¥3800.00
普通会员:¥698.00
普通会员:¥680.00
普通会员:¥680.00
普通会员:¥480.00
普通会员:¥980.00
普通会员:¥1080.00
普通会员:¥680.00
普通会员:¥798.00
普通会员:¥498.00
普通会员:¥698.00
普通会员:¥1800.00
普通会员:¥1800.00
普通会员:¥698.00
普通会员:¥680.00
普通会员:¥280.00
普通会员:¥880.00
普通会员:¥2500.00
普通会员:¥3200.00
普通会员:¥3800.00
普通会员:¥320.00
普通会员:¥580.00
普通会员:¥480.00
普通会员:¥398.00
普通会员:¥698.00
普通会员:¥880.00
普通会员:¥680.00
普通会员:¥480.00
普通会员:¥800.00
普通会员:¥380.00
普通会员:¥2240.00
普通会员:¥3200.00
普通会员:¥3500.00
普通会员:¥2400.00
普通会员:¥898.00
普通会员:¥3200.00
普通会员:¥880.00
普通会员:¥580.00
普通会员:¥678.00
普通会员:¥680.00
普通会员:¥2240.00
普通会员:¥698.00
普通会员:¥3800.00
普通会员:¥780.00
普通会员:¥898.00
普通会员:¥780.00
普通会员:¥580.00
普通会员:¥1080.00
普通会员:¥8000.00
普通会员:¥680.00
普通会员:¥1200.00
普通会员:¥680.00
普通会员:¥480.00
普通会员:¥1080.00
普通会员:¥3500.00
普通会员:¥980.00
普通会员:¥480.00
普通会员:¥380.00
普通会员:¥2800.00
普通会员:¥380.00
普通会员:¥480.00
普通会员:¥380.00
普通会员:¥680.00
普通会员:¥1080.00
普通会员:¥580.00
普通会员:¥480.00
普通会员:¥2500.00
普通会员:¥550.00
普通会员:¥2500.00
普通会员:¥480.00
普通会员:¥480.00
普通会员:¥880.00
普通会员:¥580.00
普通会员:¥1500.00
普通会员:¥480.00
普通会员:¥580.00
普通会员:¥680.00
普通会员:¥880.00
普通会员:¥680.00
普通会员:¥480.00
普通会员:¥480.00
普通会员:¥4800.00
普通会员:¥1080.00
普通会员:¥880.00
普通会员:¥7800.00
普通会员:¥7800.00
普通会员:¥7800.00
普通会员:¥7800.00
普通会员:¥699.00
普通会员:¥699.00
普通会员:¥6800.00
普通会员:¥1080.00
普通会员:¥7800.00
普通会员:¥7800.00
普通会员:¥658.00
普通会员:¥1280.00
普通会员:¥880.00
普通会员:¥7800.00
普通会员:¥680.00
普通会员:¥2800.00
普通会员:¥4800.00
普通会员:¥880.00
普通会员:¥880.00
普通会员:¥1880.00
普通会员:¥7800.00
普通会员:¥980.00
普通会员:¥680.00
普通会员:¥1680.00
普通会员:¥1080.00
普通会员:¥1680.00
普通会员:¥1280.00
普通会员:¥1280.00
普通会员:¥880.00
普通会员:¥1880.00
普通会员:¥3200.00
普通会员:¥2240.00
普通会员:¥880.00
普通会员:¥680.00
普通会员:¥10800.00
普通会员:¥8000.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥380.00
普通会员:¥2250.00
普通会员:¥1280.00
普通会员:¥880.00
普通会员:¥0.00
普通会员:¥1080.00
普通会员:¥9800.00
普通会员:¥980.00
普通会员:¥1280.00
普通会员:¥0.00
普通会员:¥880.00
普通会员:¥880.00
普通会员:¥17800.00
普通会员:¥880.00
普通会员:¥10800.00
普通会员:¥880.00
普通会员:¥9800.00
普通会员:¥17800.00
普通会员:¥8000.00
普通会员:¥17800.00
普通会员:¥880.00
普通会员:¥12800.00
普通会员:¥10800.00
普通会员:¥2250.00
普通会员:¥880.00
普通会员:¥980.00
普通会员:¥15800.00
普通会员:¥680.00
普通会员:¥1080.00
普通会员:¥8000.00
普通会员:¥880.00
普通会员:¥1080.00
普通会员:¥359.00
普通会员:¥1280.00
普通会员:¥2240.00
普通会员:¥1080.00
普通会员:¥16800.00
普通会员:¥880.00
普通会员:¥880.00
普通会员:¥1080.00
普通会员:¥16800.00
普通会员:¥1080.00
普通会员:¥1080.00
普通会员:¥880.00
普通会员:¥15800.00
普通会员:¥1280.00
普通会员:¥1080.00
普通会员:¥15800.00
普通会员:¥880.00
普通会员:¥1080.00
普通会员:¥8000.00
普通会员:¥880.00
普通会员:¥680.00
普通会员:¥8000.00
普通会员:¥7800.00
普通会员:¥100.00
普通会员:¥580.00
普通会员:¥508.00
普通会员:¥1080.00
普通会员:¥8800.00
普通会员:¥10800.00
普通会员:¥12800.00
普通会员:¥1080.00
普通会员:¥880.00
普通会员:¥480.00
普通会员:¥0.00
普通会员:¥980.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥16800.00
普通会员:¥580.00
普通会员:¥1080.00
普通会员:¥7800.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥1480.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥0.00
普通会员:¥580.00
普通会员:¥680.00
普通会员:¥680.00
普通会员:¥508.00
普通会员:¥9999.00
用户:**145531@qq.c**
用户:**145531@qq.c**
用户:****
用户:**1455907@qq.**
用户:****
用户:**3003901@qq.**
用户:**3003901@qq.**
用户:**1455907@qq.**
用户:**38513**
用户:**zy2002**
用户:****
用户:**unlouzhu**
用户:**941424@qq.c**
用户:**941424@qq.c**
用户:****
用户:****
用户:****
用户:**atvltx2150**
用户:****
用户:****
公司:上海育创网络科技股份有限公司
地址:上海浦东世纪大道1500号东方大厦13、16层
电话:400-018-6216

我要回帖

更多关于 .net mvc 单元测试 的文章

 

随机推荐