如果我得到的是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。
我不知道发生了什么。
答案 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方法。