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();
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. –
thanx, sử dụng cách tiếp cận tương tự, nhưng chỉ với khung công tác Moq. –
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