在ASP.NET MVC中对呈现的视图进行单元测试

Jen*_*enk 9 c# asp.net-mvc unit-testing

我很遗憾再次击败这个鼓,但我一直在寻找一种方法来对ASP.NET MVC中的渲染视图进行单元测试(目前使用的是v2).

我不是百分之百满意使用WatiN或Selenium来做到这一点,它们都是很棒的工具,但是对于这么简单的场景运行测试需要太长时间,并且测试方式比我需要的方式更多.

我也非常不满意"视图不应该被测试"的口头禅似乎源于视图的根本原因,在它们当前的状态下,在更大的集成测试之外是不可测试的.:)

我已经在Controller上测试了"AssertViewRendered().For("Index").WithViewData()"等等.我只是想要覆盖视图在模型上显示的数据.

想象一下这个简单的场景:

控制器:

public class SimpleController : Controller
{
    public void Index()
    {
        var vm = new SimpleViewModel { Message = "Hello world!" };
        return View(vm);
    }
}
Run Code Online (Sandbox Code Playgroud)

而这个简单的视图模型:

public class SimpleViewModel
{
    public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

一个简单的观点:

`<%@ Page Language="C#"` `Inherits="System.Web.Mvc.ViewPage<SimpleViewModel>" %>`
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <body>
        <h1><%= Model.Message %></h1>
    </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

如何使用View实际使用Message属性的简单单元测试进行自动化,而无需使用WatiN等重量级集成测试工具,也无需使用Web服务器?

这样的事情是理想的:

    [TestMethod]
    public void ShouldDisplayMessage()
    {
        const string helloWorld = "Hello world!";
        var view = new SimpleView(new SimpleViewModel { Message = helloWorld });
        var result = view.GetRenderedString();
        Assert.IsTrue(result.Contains(helloWorld));
    }
Run Code Online (Sandbox Code Playgroud)

Joh*_*lan 1

此问题是您的视图文件包含影响视图的其他信息(也称为标记)。您可以测试视图模型以在视图模型中包含正确的信息,但我不确定这正是您想要的。

您可以在查看模型时强制转换 ViewResult.ViewData.Model 并从那里断言值。

    [Test]
    public Test()
    {
        var homeController = new HomeController();
        var result = homeController.About() as ViewResult();
        Assert.IsInstanceOf(typeof(MyViewModel),result.ViewData.Model);
        var myModel = result.ViewData.Model as MyViewModel;
        Assert.That(myModel.Name,Is.EqualTo("Hello World")  );

    }
Run Code Online (Sandbox Code Playgroud)

如果您使用 Spark View 引擎,事情可能会更容易一些

http://darrell.mozingo.net/2010/01/28/in-memory-view-rendering-with-spark/