Как проверить визуализированные представления при использовании T4MVC с TestHelper? - PullRequest
2 голосов
/ 22 июля 2010

Как проверить, какое представление было визуализировано из действия контроллера, если я получаю 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.

Я не знаю, что происходит.

1 Ответ

1 голос
/ 22 июля 2010

На самом деле, 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, добавленным в частичный класс.

...