代码之家  ›  专栏  ›  技术社区  ›  Simon Steele

如何对MVC用户视图控件进行单元测试?

  •  7
  • Simon Steele  · 技术社区  · 16 年前

    我已经尝试在ASP.NET MVC中为UserViewControl编写单元测试了一段时间。我想得到这样的代码:

    [TestMethod]
    public void HaveControlToDisplayThings()
    {
        var listControl = new ControlUnderTest();
        var viewData = new ViewDataDictionary<IList<string>>(this.repo.GetMeSomeData());
    
        // Set up a ViewContext using Moq.
        listControl.SetFakeViewContext(viewData);
        listControl.ViewData = viewData;
        listControl.RenderView(listControl.ViewContext);
    
        // Never got this far, no idea if this will work :)
        string s = listControl.ViewContext.HttpContext.Response.Output.ToString();
        Assert.AreNotEqual(0, s.Length);
        foreach (var item in this.repo.GetMeSomeData())
        {
            Assert.IsTrue(s.IndexOf(item) != -1);
        }
    }
    

    不幸的是,无论我尝试什么,我都会从渲染视图的内部获得错误。这是由静态httpContext引起的(据我所知)。当前对象是无用的-我得到 NullReferenceException 来自于 System.Web.UI.Page.SetIntrinsics .

    我试着用菲尔·哈克的 HttpSimulator 它给了我一个httpContext对象,但我发现我还需要指定一个假的 HttpBrowserCapabilities 要进一步了解的对象:

    Subtext.TestLibrary.HttpSimulator simulator = new HttpSimulator();
    simulator.SimulateRequest();
    var browserMock = new Mock<HttpBrowserCapabilities>();
    browserMock.Expect(b => b.PreferredRenderingMime).Returns("text/html");
    browserMock.Expect(b => b.PreferredResponseEncoding).Returns("UTF-8");
    browserMock.Expect(b => b.PreferredRequestEncoding).Returns("UTF-8");
    HttpContext.Current.Request.Browser = browserMock.Object;
    

    现在,我在该对象的属性访问中得到异常。我尽可能多地嘲笑,但似乎进展得不快。

    有人能做到这一点吗?

    6 回复  |  直到 16 年前
        1
  •  3
  •   Matthew    16 年前

    不幸的是,ASP.NET ViewEngine在ASP.NET宿主环境中使用了VirtualPathProvider。更糟的是,我使用Reflector跟踪了其他一些代码,发现对virtualpath实用程序的一些硬代码引用还有其他依赖性。 我希望他们在版本中修复这个问题,这样我们就可以真正测试我们的视图以及它们是如何呈现的。

        2
  •  2
  •   Gavin Miller    16 年前

    一个选项是在浏览器中运行单元测试。我已经成功了 Selenium 对于这种情况。

        3
  •  2
  •   bh213    16 年前

    我们放弃了单元测试视图,现在将watin浏览器测试作为构建的一部分。

    我们还使用Resharper解决方案范围的分析来检查是否存在编译器错误。不完美,但结果非常相似。缺点-瓦特林测试很慢。

        4
  •  1
  •   Matthew M. Osborn    16 年前

    这些是需要在httpbrowsercapabilities对象中设置的值,以便ASP.NET Web窗体站点运行,我将尝试确保设置了这些值,并查看是否解决了您的问题,我不确定它是否会,但它是否值得一试,对吗?

    • 浏览器(又名)
    • useragent(在请求中传递)
    • 表(真/假)
    • 版本(浏览器版本,如1.0)
    • W3CdomVersion(例如1.0)
    • cookies(对/错)
    • ECM说明版本(例如1.0)

    希望这有帮助。

        5
  •  1
  •   Gailin    16 年前

    我建议你 selenium 以及UI测试。标准的MVC应用程序中有相当一部分可以进行单元测试,但是UI级组件似乎总是更适合于浏览器内的测试,比如Selenium。您可以使用 cruisecontrol.net .

    这里是一个 guide 用于将硒与CC.NET集成。

        6
  •  1
  •   Graviton    16 年前

    使用typemock模拟依赖项。我已经写了 one blog post 关于如何模拟控制器层中的请求和响应依赖项。也许这是有帮助的。