タイトルが示すように、コントローラー拡張機能を適切にテストする方法についての指示を探しています。この拡張機能は、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();