如何在ASP.NET MVC中围绕AreaRegistration.RegisterAllAreas获取测试覆盖率?

时间:2011-02-23 12:10:20

标签: asp.net-mvc unit-testing asp.net-mvc-3 asp.net-mvc-areas

所以我在MVC3网站上拍摄100%的报道,我们正在使用区域。除Application_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()

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

我觉得试图在应用程序上实现100%的测试覆盖率并不总是最好的方法。当然,你的应用程序应该经过充分测试,但是将所有内容都放在一边以确保你有100%的覆盖率,这样你就不会关注测试的质量和更多的覆盖范围。覆盖范围只是一个粗略的指导,并没有告诉你,如果你的测试实际上是测试他们应该只是“线x”被调用。

高TC很好,但我会说如果有100%你没有正确测试。我个人不会测试这个。

答案 1 :(得分:2)

将填充路由的代码提取到将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

的方法