제목에서 알 수 있듯이 컨트롤러 확장을 올바르게 테스트하는 방법에 대한 지침을 찾고 있습니다.유닛 테스트에서 방향을 찾고 부분 뷰를 렌더링하는 컨트롤러 확장자
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();
}
}
사용 예제 : 확장 차례로 나는 JSONResult 내에서 사용하고 부분보기 렌더링
public JsonResult Foo()
{
var model = _repository.getSomeData();
return Json(new { html = this.RenderPartialViewToString("Index", model) }, JsonRequestBehavior.AllowGet);
}
내가 NUnit과 & MvcContrib test helper을 사용하고 있습니다를, 그러나 컨트롤러를 설정할 때 이 확장 기능을 사용하여 NRE를 실행 중입니다. 컨트롤러 컨텍스트가 올바르게 설정되지 않았다고 가정합니다.
궁극적으로이 테스트는 ViewEngines.Engines.FindPartialView
에서 실행 중입니다. 당신은 당신이 FindPartialView 호출을 조롱 할 수 있도록 ViewEngines.Engines
컬렉션에 조롱보기 엔진을 추가해야합니다
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();
나는 단지 이마에 자신을 때리고 V8 광고를 인용했다. 도! 내가 볼 수없는 명백한 것을 지적 해 주셔서 감사합니다. 확실하게, 나는 심각하지 않고 우스꽝스럽지 않습니다. –
고맙습니다. 동일한 접근 방식을 사용했지만 Moq 프레임 워크 만 사용했습니다. –
MVC4에서 모의 엔진을 추가하기 전에 ViewEngines.Engines.Clear()를 수행해야 할 수도 있습니다. MVC3에서 MVC4로 업그레이드 한 후에이 작업을 수행하려면 최소한 그렇게해야합니다. – antinescience