Unit testing 在使用T4MVC和TestHelper时,如何测试渲染视图?
如果我得到的是T4MVC_ActionResult,如何测试从控制器操作呈现的视图?在正常情况下,我应该能够直接使用TestHelper的方法,如: …但是,由于通过T4MVC我得到的是T4MVC_ActionResult而不是ViewResult,因此部件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
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;
}