C# 使用ASP.NET开发服务器进行单元测试MVC
我想确认我创建的路由正在选择我的“HomeController”类。所以我有一个这样的测试:C# 使用ASP.NET开发服务器进行单元测试MVC,c#,asp.net,asp.net-mvc,visual-studio,unit-testing,C#,Asp.net,Asp.net Mvc,Visual Studio,Unit Testing,我想确认我创建的路由正在选择我的“HomeController”类。所以我有一个这样的测试: [TestMethod] [UrlToTest("http://localhost:14478/home")] [HostType("ASP.NET")] [AspNetDevelopmentServerHost("$(SolutionDir)\\MvcBuildApp")] public void MyTest() { System.Di
[TestMethod]
[UrlToTest("http://localhost:14478/home")]
[HostType("ASP.NET")]
[AspNetDevelopmentServerHost("$(SolutionDir)\\MvcBuildApp")]
public void MyTest()
{
System.Diagnostics.Debugger.Break();
RouteCollection routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);
MvcApplication.RegisterGlobalFilters(GlobalFilters.Filters);
//This fetches DefaultControllerFactory (for now, anyway...)
var factory = ControllerBuilder.Current.GetControllerFactory();
//mock a context...
var httpContext = CreateHttpContext("http://localhost:14478/home", "GET");
RouteData route = routes.GetRouteData(httpContext);
var ctrlInstance = factory.CreateController(new RequestContext(httpContext, route), (string)route.Values["controller"]);
//ASSERT the instance is of type "HomeController"
//...
}
它失败了,说'http://localhost:14478/home'在未运行测试的情况下成功完成。
我注意到在VS output窗口中,还有一条消息无法建立连接,因为目标机器主动拒绝了它127.0.0.1:14478
。我想卡西尼号一定不活跃。因此,我选择在启动单元测试之前启动正在测试的站点(ctrl+F5)。然后将VS输出更改为:
WebTestAdapter.ConnectToHostAdapter:发生意外异常。
Microsoft.VisualStudio.TestTools.HostAdapters.AbortTestExecutionException异常:
应用程序中的错误。在
Microsoft.VisualStudio.TestTools.HostAdapters.WebTestAdapter.ConnectToHostAdapter()
为了解决这个问题,我遵循了以下文章的建议:
- :这讨论了“未运行测试而成功完成”错误
- :我从这篇文章中得到了$(SolutionDir)的想法
这个问题不是关于测试MVC路由的。这个问题的目的是了解如何正确初始化ASP.NET MVC,以允许进行更深入的自动化测试。我选择了一个针对DefaultControllerFactory的“路由测试”场景,仅作为示例。在本例中,除非ASP.NET MVC正确初始化,否则DefaultControllerFactory无法正常运行。这是测试MVC应用程序时的常见要求,幸运的是,有一个框架可以简化您在测试MVC控制器时的生活: 这些工具是: 例如,您可以仅使用一行创建测试:
"~/".ShouldMapTo<HomeController>(controller => controller.Index());
“~/”.ShouldMapTo(controller=>controller.Index());
作为参考:
您可能有兴趣回顾Steve Sandersons的MVC测试框架。如果下载源代码,您将有一个关于如何初始化MVC框架的好例子:
我已经更新了我的问题,以澄清我实际上并没有询问路线测试。您会注意到,我的示例测试使用DefaultControllerFactory,并有一条关于替换该工厂的注释。一旦工厂被替换,您引用的MVCContrib TestHelper将不再对我有利。Steven的方法,在您提供的链接中表达出来,绝对是绝妙的。我几乎没有什么比这更好的了。它没有回答我如何使用AspNetDevelopmentServerHost和HostType注释的问题,但就我而言,它做了一些等效或更好的事情。