Asp.net-Mvc

尋找對呈現部分視圖的控制器擴展進行單元測試的方向

  • January 14, 2012

正如標題所說,我正在尋找如何正確測試控制器擴展的方向。該擴展呈現一個局部視圖,而我又在 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();

您必須將模擬視圖引擎添加到ViewEngines.Engines集合中,以便可以模擬 FindPartialView 呼叫。以下是 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);

然後你可以斷言 view.Render 方法被呼叫,攔截它的參數並將一些模擬數據寫入這個 writer,最後斷言你的控制器操作返回了這個模擬字元串。

引用自:https://stackoverflow.com/questions/8859077