Asp.net-Mvc
尋找對呈現部分視圖的控制器擴展進行單元測試的方向
正如標題所說,我正在尋找如何正確測試控制器擴展的方向。該擴展呈現一個局部視圖,而我又在 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,最後斷言你的控制器操作返回了這個模擬字元串。