13

제목에서 알 수 있듯이 컨트롤러 확장을 올바르게 테스트하는 방법에 대한 지침을 찾고 있습니다.유닛 테스트에서 방향을 찾고 부분 뷰를 렌더링하는 컨트롤러 확장자 ​​

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(); 

답변

22

: 여기에 실패한 시험의 일부이다. 여기 코뿔소 모의 객체와 예는 다음과 같습니다

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 메소드가 호출 된 것을 주장 인수를 가로 채고이 작가에 약간의 조롱 데이터를 작성하고 최종적으로 컨트롤러 액션이 조롱 문자열을 반환 주장 할 수있다.

+0

나는 단지 이마에 자신을 때리고 V8 광고를 인용했다. 도! 내가 볼 수없는 명백한 것을 지적 해 주셔서 감사합니다. 확실하게, 나는 심각하지 않고 우스꽝스럽지 않습니다. –

+0

고맙습니다. 동일한 접근 방식을 사용했지만 Moq 프레임 워크 만 사용했습니다. –

+5

MVC4에서 모의 ​​엔진을 추가하기 전에 ViewEngines.Engines.Clear()를 수행해야 할 수도 있습니다. MVC3에서 MVC4로 업그레이드 한 후에이 작업을 수행하려면 최소한 그렇게해야합니다. – antinescience

관련 문제