【发布时间】:2010-12-10 16:57:14
【问题描述】:
我正在尝试对将数据填充到 ViewData 中的控制器进行单元测试。我们所有的视图都需要类似的数据(来自 url 的客户信息)。因此,最初的开发人员没有将调用放入每个控制器方法中,而是选择将此 ViewData 填充到 OnActionExecuting 事件中。
当然,当您从单元测试中调用控制器的操作时,不会触发 OnActionExecuting。 (感谢 MVC 团队!)
所以我尝试创建一个自定义视图引擎,并在请求视图时将客户数据填充到 controllerContext 中。这在浏览器中运行良好,但是当我运行这个测试时,我的 viewEngine 被忽略了。 ViewEngines.Add(new funkyViewEngine) 没有任何效果。
[TestMethod()]
public void LoginTest()
{
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new FunkyViewEngine());
UserController target = new UserController();
target.SetStructureMap(); <--sets us to use the test repo
target.ControllerContext.HttpContext = MVCHelpers.FakeHttpContext("https://customersubdomain.ourdomain.com"); <--moq magic
var actual = target.Login();
Assert.IsTrue(actual.GetType().IsAssignableFrom(typeof(System.Web.Mvc.ViewResult)));
var vr = actual as ViewResult;
Assert.IsTrue(vr.ViewData.Community() != null); <--"Community" should be set by viewengine
Assert.IsTrue(vr.ViewData.Community().Subdomain == "customersubdomain.ourdomain");
Assert.IsTrue(vr.ViewData.Community().CanRegister);
}
这里有希望吗?我该如何 1) 创建一个在浏览器和单元框架中的控制器执行时都被调用的方法,或者 2) 让单元框架调用我的视图引擎。
【问题讨论】:
标签: unit-testing asp.net-mvc-2 viewengine