Ищете направление на модульном тестировании расширения контроллера, которое отображает частичный вид
Как говорится в заголовке, я ищу направление для правильной проверки расширения контроллера. Расширение предоставляет частичный вид, который в свою очередь я использую в JSONResult:
public static string RenderPartialViewToString(this Controller controller, string viewName = null, object model = null)
{
if (string.IsNullOrEmpty(viewName))
{
viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
}
controller.ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
Пример использования:
public JsonResult Foo()
{
var model = _repository.getSomeData();
return Json(new { html = this.RenderPartialViewToString("Index", model) }, JsonRequestBehavior.AllowGet);
}
Я использую NUnit и тестовый помощник MvcContrib, однако при настройке контроллера, использующего это расширение, я запускаю NRE. Я предполагаю, что контекст контроллера настроен неправильно?
В конечном счете тест накладывается на ViewEngines.Engines.FindPartialView
. Вот часть неудачного теста:
var routeData = new RouteData();
routeData.Values.Add("controller", "someName");
routeData.Values.Add("action", "someAction");
var builder = new TestControllerBuilder();
var controller = new ListingController(repository.Object);
builder.RouteData = routeData;
builder.InitializeController(controller);
var result = controller.Foo();
Ответы
Ответ 1
Вам нужно будет добавить движок просмотра в коллекцию ViewEngines.Engines
, чтобы вы могли издеваться над вызовом FindPartialView. Вот пример с Rhino Mocks:
var view = MockRepository.GenerateStub<IView>();
var engine = MockRepository.GenerateStub<IViewEngine>();
var viewEngineResult = new ViewEngineResult(view, engine);
engine
.Stub(x => x.FindPartialView(null, null, false))
.IgnoreArguments()
.Return(viewEngineResult);
ViewEngines.Engines.Add(engine);
Тогда вы могли бы утверждать, что был вызван метод view.Render, перехватите его аргументы и напишите некоторые издевавшиеся данные этому писателю и, наконец, утвердите, что действие вашего контроллера вернуло эту издеваемую строку.