【发布时间】: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