我很抱歉再次敲打这个鼓,但我一直在寻找一种方法来单元测试在 ASP.NET MVC(当前使用 v2)中呈现的 View 。
我对使用 WatiN 或 Selenium 来做这件事不是 100% 满意,它们都是很棒的工具,但是对如此简单的场景进行测试需要花费太长时间,并且测试的方式比我多得多需要。
我也对“不应测试 View ”的口头禅深感不满,该口头禅似乎源于 View 的根本原因,在当前状态下,无法在更大的集成测试之外进行测试。 :)
我已经使用“AssertViewRendered().For("Index").WithViewData()”等对 Controller 进行了测试。我只是想说明数据在 View 打开时显示模型。
想象一下这个简单的场景:
Controller :
public class SimpleController : Controller
{
public void Index()
{
var vm = new SimpleViewModel { Message = "Hello world!" };
return View(vm);
}
}
还有这个简单的 View 模型:
public class SimpleViewModel
{
public string Message { get; set; }
}
还有一个简单的 View :
`<%@ 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 实际上使用消息属性,而不需要使用像 WatiN 这样的重量级集成测试工具,并且没有网络服务器?
像这样的东西是理想的:
[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 文件包含影响 View 的其他信息(也称为标记)。您可以测试 View 模型以在 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 View 引擎,事情可能会更容易一些
http://darrell.mozingo.net/2010/01/28/in-memory-view-rendering-with-spark/
关于c# - 在 ASP.NET MVC 中对呈现的 View 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5262982/