Asp.net mvc 如何在ASP.NET MVC中获得AreaRegistration.RegisteralArea的测试覆盖率?

Asp.net mvc 如何在ASP.NET MVC中获得AreaRegistration.RegisteralArea的测试覆盖率?,asp.net-mvc,unit-testing,asp.net-mvc-3,asp.net-mvc-areas,Asp.net Mvc,Unit Testing,Asp.net Mvc 3,Asp.net Mvc Areas,所以我在MVC3网站上拍摄100%的覆盖率,我们使用的是区域。除了应用程序\u Start中的这一行之外,我可以获得其他所有内容的保险: AreaRegistration.RegisterAllAreas(); 我已经彻底测试了每个区域的注册,因此这实际上相当于某种程度上的集成测试,但是我仍然希望以某种方式覆盖它,而不必求助于CoverageExclude属性或降低覆盖率百分比 请注意,在NUnit中进行单元测试会出现以下异常片段: System.InvalidOperationExcepti

所以我在MVC3网站上拍摄100%的覆盖率,我们使用的是区域。除了
应用程序\u Start
中的这一行之外,我可以获得其他所有内容的保险:

AreaRegistration.RegisterAllAreas();
我已经彻底测试了每个区域的注册,因此这实际上相当于某种程度上的集成测试,但是我仍然希望以某种方式覆盖它,而不必求助于CoverageExclude属性或降低覆盖率百分比

请注意,在NUnit中进行单元测试会出现以下异常片段:

System.InvalidOperationException : This method cannot be called during the application's pre-start initialization stage. at System.Web.Compilation.BuildManager.EnsureTopLevelFilesCompiled() at System.Web.Compilation.BuildManager.GetReferencedAssemblies()

有什么想法吗?

我觉得尝试在应用程序上实现100%的测试覆盖率并不总是最好的方法。确保你的应用程序应该经过良好的测试,但为了确保你有100%的覆盖率,把一切都放在一边,这样你就不会把注意力集中在测试的质量和更多的覆盖率上。覆盖率只是一个粗略的指南,并没有告诉您您的测试是否真正在测试它们应该是什么,只是调用了“第x行”


有高TC是好的,但我会说,如果有100%你没有正确测试。就个人而言,我不会对此进行测试。

将填充路由的代码提取到以RouteCollection为参数的方法。 然后,您可以在通过空集合的测试中调用它,并验证它是否包含您需要的所有路由

 public static void RegisterRoutes(RouteCollection routes)
 {
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

     routes.MapRoute(
        "Default_without_optional_params", // Route name
        "{controller}.aspx/{action}", // URL with parameters
        new { controller = "Home", action = "Index" } // Parameter defaults
     );
 }


    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }

这同样适用于区域。提取一个采用
AreaRegistrationContext

的方法,我完全同意你的观点,最终我将使用覆盖率过滤器排除这个问题。我只是好奇是否有可能以这种方式对任何调用构建管理器的东西进行真正的单元测试。我对这个答案的理解越多,就越觉得接受它是我的道德责任。毕竟,这一切都是关于“重要的工作软件”,而不是实现可能重要也可能不重要的工作软件的人工度量。谢谢你帮我摆脱了以前的状态…尽管我一直想知道它是否可以覆盖。很高兴你看到了光明:P@brandon-林惇,尽管我完全同意莎拉的观点,但我认为这不应该被标记为答案,因为它不能回答问题!(其他有同样问题的人将无法从中获得帮助。)@BrandonLinton虽然实现100%的测试覆盖率是没有成效的,但对路由的测试覆盖率对于任何一个不重要的应用程序都是重要的。我按照您描述的方式对路由进行了测试覆盖。我只是想知道如果你有
AreaRegistration.registeralAreas()
,是否有任何方法来测试应用程序的启动方法,因为它看起来不可能在运行的web应用程序之外调用。哦,我明白了。这里可能需要一个策略模式:提取一个接口IAreaRegistration并在两个类上实现它:FullAreaRegistration和TestarRegistration。测试一不会做任何事情,你可以在测试中使用它。酷,谢谢你的想法。我已经对区域路线进行了很好的测试。在“所有区域”注册之后,我永远都无法找到一行(大括号),所以我只是将我的工作重新定向到TeamCity中的排除过滤器上。@JakubKonecki,请您详细说明一下什么
同样适用于区域。提取一个采用AreaRegistrationContext的方法。
实际上是什么意思?最好有一些代码。(因为我已经提取了方法,现在我不知道用什么参数来调用它。)传递
AreaRegistrationContext
的一个新实例或一个模拟实例,然后测试是否所有预期的路由都已注册。