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)
此问题是您的视图文件包含影响视图的其他信息(也称为标记)。您可以测试视图模型以在视图模型中包含正确的信息,但我不确定这正是您想要的。
您可以在查看模型时强制转换 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/
| 归档时间: |
|
| 查看次数: |
3767 次 |
| 最近记录: |