开发者

How do I test rendered views when using T4MVC with TestHelper?

How do I test which view was rendered from a controller action if what I get is a T4MVC_ActionResult? Under normal circumstances I should be able to directly use TestHelper's methods, like in the examples:

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

...but, since through T4MVC I get a T4MVC_ActionResult instead of a ViewResult, the part AssertViewRendered<>().ForView("Details") fails. What alternative do I have if I want to test which view was invoked?


UPDATE:

Here's the test code:

[TestMethod]
public void Theme_Controller_Details_Action_Returns_Details_View()
{
    var builder = new TestControllerBuil开发者_如何学运维der();
    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");
}

I used the debugger setting a breakpoint after the result line, and its variable type is T4MVC_ActionResult, while themeController is Evalgrid.Website.controllers.ThemeController. Note that I have used the fully qualified name of the controller.

I get this:

Expected result to be of type ViewResult. It is actually of type T4MVC_ActionResult.

I don't know what's going on.


Actually, T4MVC should not make a difference here. If you directly instantiate your controller and call an action method, you'll get the same thing back whether you use T4MVC or not. i.e. you won't get a T4MVC_ActionResult.

It's only when you write MVC.Foo.Details() that you'll get a T4MVC_ActionResult. That's because MVC.Foo returns an instance of a derived class which does special thing, and not directly your controller class.

Does that make sense?

Update: I'm confused, as looking at the sources for TestControllerBuilder.CreateController, it has:

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

So it's directly instantiating the type that you pass in, which should just call your normal action.

One question about your code: does your Details action method take any parameters? If so, that would explain the problem, as you're calling it with no params, which would be a T4MVC method added in the partial class.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜