NunitTestingMVCWebsite、会员资格等)全面测试一切。测试一些不那么前端的东西甚至需要会员资格才能正常工作,而且手工欺骗这一切是很挑剔的。有没有办法在NUnit测试中启动应用程序池?这似乎是最简单的方法。我不知道有什么办法可以做到这一点,因为您的代码不在那个过程中,并且需要一个不在aspnet中的主机。(我以前就错了,哈哈)PhilHaack的旧HttpSimulator,你有旋转吗?http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-a-web-server-using-httpsimulator.aspx如果写得正确,你不需要有一个真正的上下文、真实会话、cookie等。默认情况下,MVC框架提供了一个可以被模拟/存根的HttpContext。我建议使用像Moq或RhinoMocks这样的模拟框架,并创建一个MockHttpContext类,它创建一个模拟上下文,其中包含您需要针对您的设置进行测试的所有属性。这是一个使用Moq的模拟HttpContext//////模拟整个HttpContext以用于单元测试///publicclassMockHttpContextBase{//////初始化该类的新实例。///publicMockHttpContextBase():this(newMock().Object,"~/"){}//////初始化类的新实例。//////控制器。publicMockHttpContextBase(Controllercontroller):this(controller,"~/"){}//////初始化类的新实例。//////网址。publicMockHttpContextBase(stringurl):this(newMock().Object,url){}//////初始化类的新实例。//////控制器。///网址。publicMockHttpContextBase(ControllerBasecontroller,stringurl){HttpContext=newMock();请求=新模拟();响应=新模拟();输出=新的StringBuilder();HttpContext.Setup(x=>x.Request).Returns(Request.Object);HttpContext.Setup(x=>x.Response).Returns(Response.Object);HttpContext.Setup(x=>x.Session).Returns(新的FakeSessionState());Request.Setup(x=>x.Cookies).Returns(newHttpCookieCollection());Request.Setup(x=>x.QueryString).Returns(newNameValueCollection());Request.Setup(x=>x.Form).Returns(newNameValueCollection());Request.Setup(x=>x.ApplicationPath).Returns("~/");Request.Setup(x=>x.AppRelativeCurrentExecutionFilePath).Returns(url);Request.Setup(x=>x.PathInfo).Returns(string.Empty);Response.Setup(x=>x.Cookies).Returns(newHttpCookieCollection());Response.Setup(x=>x.ApplyAppPathModifier(It.IsAny())).Returns((stringpath)=>path);Response.Setup(x=>x.Write(It.IsAny())).Callback(s=>Output.Append(s));varrequestContext=newRequestContext(HttpContext.Object,newRouteData());controller.ControllerContext=newControllerContext(requestContext,controller);}//////获取HTTP上下文。//////HTTP上下文。公共模拟HttpContext{得到;私有集;}//////获取请求。//////请求。民众模拟请求{get;私有集;}//////获取响应。//////响应。公共模拟响应{get;私有集;}//////获取输出。/////输出。公共StringBuilder输出{得到;私有集;}}//////提供用于单元测试的假会话///publicclassFakeSessionState:HttpSessionStateBase{//////会话中项目的支持字段///privatereadonlyDictionary_items=newDictionary();//////获取或设置具有指定名称的。//////键///会话中的值publicoverrideobjectthis[stringname]{get{return_items.ContainsKey(name)?_items[名称]:空;}设置{_items[名称]=值;您可以进一步添加一些东西,例如HTTP标头集,但希望它能演示您可以做什么使用varcontrollerToTest=newHomeController();varcontext=newMockHttpContextBase(controllerToTest);//做一些你想测试的事情,例如一些东西进入会话Assert.IsTrue(context.HttpContext.Session.Count>0);供应商或其他提供商,您遇到了一个难以测试的问题。我将提取接口背后的提供者用法,以便在测试依赖它的组件时可以为接口提供伪造。您仍然无法对使用提供程序的接口的具体实现进行单元测试,但您的里程数可能会有所不同,具体取决于您对单元测试和代码覆盖率的要求。您需要为这些服务构建包装器接口。最初的MVC2和MV3入门项目模板默认执行此操作,但出于某种原因,他们在最新版本中将其删除。您可以尝试找到原始AccountController代码的示例,为您提供一个起点。他们使用IMembershipService和IFormsAuthenticationService来模拟会话,上下文等是比较简单的。看看MVCContrib项目(http://mvccontrib.codeplex.com/),因为他们有一个帮助程序来创建充满各种上下文对象(如HttpContext)的控制器。以上是C#学习教程:Nunit测试MVC网站分享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
