Unit testing 在使用T4MVC和TestHelper时,如何测试渲染视图?

Unit testing 在使用T4MVC和TestHelper时,如何测试渲染视图?,unit-testing,asp.net-mvc-2,t4mvc,mvccontrib-testhelper,Unit Testing,Asp.net Mvc 2,T4mvc,Mvccontrib Testhelper,如果我得到的是T4MVC_ActionResult,如何测试从控制器操作呈现的视图?在正常情况下,我应该能够直接使用TestHelper的方法,如: …但是,由于通过T4MVC我得到的是T4MVC_ActionResult而不是ViewResult,因此部件AssertViewRendered().ForView(“详细信息”)失败。如果我想测试调用了哪个视图,我有什么选择 更新: 以下是测试代码: [TestMethod] public void Theme_Controller_Detai

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

…但是,由于通过T4MVC我得到的是T4MVC_ActionResult而不是ViewResult,因此部件
AssertViewRendered().ForView(“详细信息”)
失败。如果我想测试调用了哪个视图,我有什么选择


更新:

以下是测试代码:

[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");
}
[TestMethod]
公共无效主题\控制器\详细信息\操作\返回\详细信息\视图()
{
var builder=newtestcontrollerbuilder();
var mockThemeRepository=new Mock();
var themeconroller=builder.CreateController(mockThemeRepository.Object);
builder.initializeconcontroller(主控制器);
var result=themeconcontroller.Details();
result.AssertViewRendered().ForView(“详细信息”);
}
我使用调试器在
result
行后设置断点,其变量类型为T4MVC\u ActionResult,而经济控制器为
Evalgrid.Website.controllers.the经济控制器。请注意,我使用了控制器的完全限定名称

我明白了:

预期结果为类型 查看结果。它实际上是一种 T4MVC_操作结果


我不知道发生了什么。

事实上,T4MVC在这里不应该有什么不同。如果直接实例化控制器并调用操作方法,无论是否使用T4MVC,都会得到相同的结果。i、 e.您不会得到T4MVC_ActionResult

只有在编写MVC.Foo.Details()时,才会得到T4MVC\U 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;
}
public T CreateController(params object[]constructorArgs),其中T:Controller
{
var controller=(controller)Activator.CreateInstance(typeof(T),constructorArgs);
初始化控制器(控制器);
返回控制器为T;
}
所以它直接实例化了您传入的类型,这应该只调用您的正常操作


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

我想是的,但我仍然存在问题。我添加了更多细节。啊。。。该死,你说得对极了。它只接受一个参数。真是太感谢你了,真奇怪。TestControllerBuilder来自哪里?@David TestControllerBuilder来自MvcContrib.TestHelper好的,我需要熟悉它并进行调查。我会给你回复的。请看下面我的答案更新
public T CreateController<T>(params object[] constructorArgs) where T : Controller
{
  var controller = (Controller)Activator.CreateInstance(typeof(T), constructorArgs);
  InitializeController(controller);
  return controller as T;
}