タイトルには、コントローラエクステンションを適切にテストする方法の方向性があります。ユニットテストの方向を探す部分的なレンダリングを行うコントローラエクステンション
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のコマーシャルを引用した。ドー!私が見ることができない明らかなことを指摘してくれてありがとう。ちょうど確かに、私は深刻ではありません。 –
thanx、同じアプローチを使用しましたが、Moqフレームワークを使用しました。 –
MVC4では、モックエンジンを追加する前にViewEngines.Engines.Clear()を実行する必要があります。 MVC3からMVC4にアップグレードした後、これを動作させるには、少なくともこれが必要でした。 – antinescience