将T4MVC与TestHelper一起使用时,如何测试渲染视图?

时间:2010-07-21 22:13:44

标签: unit-testing asp.net-mvc-2 t4mvc mvccontrib-testhelper

如果我得到的是T4MVC_ActionResult,如何测试从控制器操作呈现的视图?在正常情况下,我应该能够直接使用TestHelper的方法,例如在the examples中:

pooController.Details().AssertViewRendered().ForView("Details")

...但是,因为通过T4MVC我得到一个T4MVC_ActionResult而不是ViewResult,所以部分AssertViewRendered<>().ForView("Details")失败了。如果我想测试调用哪个视图,我还有什么选择?


更新:

这是测试代码:

[TestMethod]
public void Theme_Controller_Details_Action_Returns_Details_View()
{
    var builder = new TestControllerBuilder();
    var mockThemeRepository = new Mock<IThemeRepository>();
    var themeController = builder.CreateController<Evalgrid.Website.Controllers.ThemeController>(mockThemeRepository.Object);
    builder.InitializeController(themeController);

    var result = themeController.Details();
    result.AssertViewRendered().ForView("Details");
}

我使用调试器设置result行之后的断点,其变量类型为T4MVC_ActionResult,而themeController为Evalgrid.Website.controllers.ThemeController。请注意,我使用了控制器的完全限定名称。

我明白了:

  

预期结果为类型   的ViewResult。它实际上是类型   T4MVC_ActionResult。

我不知道发生了什么。

1 个答案:

答案 0 :(得分:1)

实际上,T4MVC在这里不应该有所作为。如果您直接实例化控制器并调用一个动作方法,那么无论您是否使用T4MVC,都会得到同样的结果。即你不会得到T4MVC_ActionResult。

只有当你编写MVC.Foo.Details()时才会得到T4MVC_ActionResult。那是因为MVC.Foo返回一个派生的类的实例,它做了特殊的事情,而不是直接控制器类。

这有意义吗?

更新:我很困惑,在查看TestControllerBuilder.CreateController的来源时,它有:

public T CreateController<T>(params object[] constructorArgs) where T : Controller
{
  var controller = (Controller)Activator.CreateInstance(typeof(T), constructorArgs);
  InitializeController(controller);
  return controller as T;
}

所以它直接实例化你传入的类型,这应该只是调用你的正常动作。

关于您的代码的一个问题:您的Details操作方法是否采用任何参数?如果是这样,那就可以解释这个问题,因为你在没有参数的情况下调用它,这将是在部分类中添加的T4MVC方​​法。