【问题标题】:Unit Test MVC with ASP.NET Dev Server使用 ASP.NET 开发服务器对 MVC 进行单元测试
【发布时间】:2012-05-07 21:52:29
【问题描述】:

我想确认我创建的路由选择了我的“HomeController”类。所以我有一个这样的测试:

    [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' completed successfully without running the test.

我注意到在VS的输出窗口中,也有这个消息No connection could be made because the target machine actively refused it 127.0.0.1:14478。我想卡西尼一定不能活跃。所以我选择在启动单元测试之前启动正在测试的站点(ctrl+F5)。然后将 VS 输出更改为:

WebTestAdapter.ConnectToHostAdapter:发生意外异常。 Microsoft.VisualStudio.TestTools.HostAdapters.AbortTestExecutionException: 应用程序中的错误。在 Microsoft.VisualStudio.TestTools.HostAdapters.WebTestAdapter.ConnectToHostAdapter()

为了解决这个问题,我遵循了这些文章的建议:

...但无论我做什么,我仍然会收到错误消息。有什么建议吗?

更新/澄清
这个问题不是关于测试 MVC 路由的。这个问题的目的是发现如何正确初始化 ASP.NET MVC 以允许更“深入”的自动化测试。我选择了一个针对 DefaultControllerFactory 的“路由测试”场景,仅作为示例。在此示例中,除非正确初始化 ASP.NET MVC,否则 DefaultControllerFactory 不会正常运行。

【问题讨论】:

    标签: c# asp.net asp.net-mvc visual-studio unit-testing


    【解决方案1】:

    这是测试 MVC 应用程序时的常见要求,幸运的是,有一个框架可以简化您在测试 MVC 控制器时的工作:

    工具是:

    http://mvccontrib.codeplex.com/

    作为一个例子,你可以只用一行来创建测试:

    "~/".ShouldMapTo<HomeController>(controller => controller.Index());
    

    作为参考:

    http://geekswithblogs.net/thomasweller/archive/2009/11/02/unit-testing-asp.net-mvc-routes.aspx

    http://www.arrangeactassert.com/how-to-unit-test-asp-net-mvc-controllers/

    【讨论】:

    • 我更新了我的问题以澄清我实际上并不是在询问路线测试。您会注意到我的示例测试使用 DefaultControllerFactory 并且有关于替换该工厂的评论。一旦工厂被替换,您引用的 MVCContrib TestHelper 将不再使我受益。
    【解决方案2】:

    您可能有兴趣查看 Steve Sandersons MVC 测试框架。如果您下载源代码,您将获得有关如何初始化 MVC 框架的一个很好的示例:

    http://blog.codeville.net/2009/06/11/integration-testing-your-aspnet-mvc-application/

    【讨论】:

    • Steven 的方法,在您提供的链接中表达,绝对出色。我几乎不能指望更好的了。它没有回答我如何使用 AspNetDevelopmentServerHost 和 HostType 注释的问题,但就我而言,它做了等效或更好的事情。
    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-15
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多