2

如果我得到的是 T4MVC_ActionResult,我如何测试哪个视图是从控制器操作呈现的?在正常情况下,我应该可以直接使用 TestHelper 的方法,例如示例

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 类型。

我不知道发生了什么事。

4

1 回答 1

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 方法。

于 2010-07-22T04:48:20.960 回答