13

Khi tựa đề cho biết, tôi đang tìm hướng dẫn về cách kiểm tra phần mở rộng bộ điều khiển đúng cách. Phần mở rộng làm cho một cái nhìn cục bộ do đó tôi đang sử dụng trong vòng một JsonResult:Tìm hướng trên đơn vị kiểm tra phần mở rộng bộ điều khiển hiển thị một phần xem

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

Ví dụ sử dụng:

public JsonResult Foo() 
{ 
    var model = _repository.getSomeData(); 

    return Json(new { html = this.RenderPartialViewToString("Index", model) }, JsonRequestBehavior.AllowGet); 
} 

Tôi đang sử dụng NUnit & các MvcContrib test helper, tuy nhiên khi thiết lập một bộ điều khiển sử dụng phần mở rộng này tôi đang chạy vào một NRE. Tôi giả định rằng bối cảnh điều khiển không được thiết lập chính xác?

Cuối cùng thử nghiệm là chặn trên ViewEngines.Engines.FindPartialView. Đây là một phần của thử nghiệm thất bại:

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

Trả lời

22

Bạn sẽ có thêm một công cụ xem chế giễu đến việc thu thập ViewEngines.Engines để bạn có thể thử gọi FindPartialView. Dưới đây là một ví dụ với 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); 

Sau đó, bạn có thể khẳng định rằng phương pháp view.Render được gọi, chặn đối số của nó và viết một số dữ liệu chế giễu đến nhà văn này và cuối cùng khẳng định rằng hành động điều khiển của bạn trở lại chuỗi chế giễu này.

+0

Tôi chỉ tự mình đập vào trán và trích dẫn bản thương mại V8. Doh! Cảm ơn bạn đã chỉ ra điều hiển nhiên mà tôi không thể thấy. Chỉ để chắc chắn, tôi đang nghiêm túc, không phải là một người đàn ông. –

+0

thanx, sử dụng cách tiếp cận tương tự, nhưng chỉ với khung công tác Moq. –

+5

Trong MVC4, bạn có thể phải làm ViewEngines.Engines.Clear() trước khi thêm động cơ giả. Ít nhất đó là những gì tôi phải làm để làm việc này sau khi nâng cấp từ MVC3 lên MVC4. – antinescience