【问题标题】:Unit testing a rendered View in ASP.NET MVC在 ASP.NET MVC 中对呈现的视图进行单元测试
【发布时间】:2011-03-10 16:50:18
【问题描述】:

我很抱歉再次敲鼓,但我一直在寻找一种方法来单元测试在 ASP.NET MVC(当前使用 v2)中呈现的视图。

我对使用 WatiN 或 Selenium 执行此操作不是 100% 满意,它们都是很棒的工具,但是对于如此简单的场景运行测试需要很长时间,并且测试的方式比我多需要。

我也非常不满意“视图不应该被测试”的口头禅,这似乎源于视图的根本原因,在目前的状态下,只是在更大的集成测试之外无法测试。 :)

我已经用“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));
    }

【问题讨论】:

  • 考虑到您的视图不会有任何逻辑(推荐),是否值得为视图创建和维护单元测试?
  • 总之.. 是的 :) 我们想要一个测试来表明我们在视图中使用了 ViewModel 的属性。鉴于这是一个非常轻量级的测试,我不想使用 Selenium/WatiN(以及浏览器、IIS、控制器以及运行和显示网页所需的一切)来执行此操作。时间太长了:)
  • 我被推到了“不要测试你无法控制的东西”的道路上。这基本上意味着,您的时间可能浪费在尝试编写验证框架是否正常工作的测试上。很抱歉再次重申这一点,但您应该花时间测试您实际编写的例程。
  • 我们已经组成了这个视图。我并不是说该框架可以完成它的工作。我断言视图使用并显示传递给它的值。我们对视图显示的内容有充分的控制——这就是为什么我要对其进行测试。
  • 测试数据是否存在我想测试数据是否按预期处理。我正在寻找一种访问呈现的 html 的方法,因此我可以为模型传递一个模拟并断言 html 的特定结构。

标签: c# asp.net-mvc unit-testing


【解决方案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")  );

    }

如果您使用火花视图引擎,事情可能会简单一些

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

【讨论】:

  • 我已经对此进行了测试,正如我在原始问题中所解释的那样 :) Spark 是我考虑过的东西,但在这个阶段我不想考虑新的视图引擎的一个简单的测试。 :)
猜你喜欢
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多