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

:ここで失敗するテストの部分があります。ここではRhinoのモックとの例を示します

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

thanx、同じアプローチを使用しましたが、Moqフレームワークを使用しました。 –

+5

MVC4では、モックエンジンを追加する前にViewEngines.Engines.Clear()を実行する必要があります。 MVC3からMVC4にアップグレードした後、これを動作させるには、少なくともこれが必要でした。 – antinescience