views:

49

answers:

1

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 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");
}

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.

+1  A: 

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(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.

David Ebbo
I think I do, but I still have the problem. I've added more detail.
Kenji Kina
Ah... dang, you're absolutely right. It does take a single parameter. I can't thank you enough.
Kenji Kina