繁体   English   中英

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

[英]Unit testing a rendered View in ASP.NET MVC

我很遗憾再次击败这个鼓,但我一直在寻找一种方法来对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);
    }
}

而这个简单的视图模型:

public class SimpleViewModel
{
    public string Message { get; set; }
}

一个简单的观点:

`<%@ 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>

如何使用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));
    }

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

在查看模型并从那里断言值时,可以强制转换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")  );

    }

如果您使用了spark视图引擎,事情可能会更容易一些

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM