我想(單元)測試函數System.Web.Mvc.ViewEngines.Engines.FindPartialView
並檢查HTML代碼的正確返回值。測試函數「System.Web.Mvc.ViewEngines.Engines.FindPartialView」
但是每次我開始單元測試時,它都會拋出"Object reference not set to an instance of an object"
異常。
我試過通過.net框架源代碼進行調試,但調試器會迷失方向並隨機跳/不帶任何消息跳轉。
現在我想知道我在FakeControllerContext
中錯過了什麼元素以及如何解決它。
這裏是我的代碼:
public static string RenderPartialViewToString(string viewName, object model, ControllerContext controller)
{
if (string.IsNullOrEmpty(viewName))
viewName = controller.RouteData.GetRequiredString("action");
controller.Controller.ViewData.Model = model;
using (var sw = new StringWriter())
{
//"Error: ***.Shop.UnitTests.RenderStuffTest.RenderPartialViewToStringTest-Test method threw an exception: System.NullReferenceException – Object reference not set to an instance of an object"
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller, viewName);
controller.Controller.ViewData.Model = model;
controller.Controller.ViewBag.Part = true;
var viewContext = new ViewContext(controller, viewResult.View, controller.Controller.ViewData,
controller.Controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
這是我的測試:
[TestMethod]
public void RenderPartialViewToStringTest()
{
const string viewName = "_navi";
var customersController = new ArticleController();
customersController.ControllerContext = new FakeControllerContext(customersController) { RouteData =
{
Route =
new Route(
"{language}/{controller}/{action}/{id}",
new MvcRouteHandler())
,
RouteHandler = new MvcRouteHandler()
},
};
customersController.ControllerContext.RouteData.Values.Add("language", "German");
customersController.ControllerContext.RouteData.Values.Add("controller", "Article");
customersController.ControllerContext.RouteData.Values.Add("action", "Index");
customersController.ControllerContext.RouteData.Values.Add("id", "");
var model = (...);
string actual = RenderStuff.RenderPartialViewToString(viewName, model, customersController.ControllerContext);
(...)
}
對於我使用Rhino.Mocks
嘲諷和MvcFakes
從Stephenwalther.com
也許它試圖從不會被設置的線程讀取'HttpContext.Current'。你爲什麼要單元測試這個?嘗試下載MVC源代碼 - 您應該在那裏找到微軟現有的單元測試。 – Rup
我已經看到了一篇文章。 此視圖用於網站和電子郵件與文章推薦。 但是這兩個調用之間的html差別不大。 現在我想編寫一個測試來檢查這兩個調用的視圖。 也許我沒有在mvc項目文件中找到正確的單元測試,但是我沒有得到一個測試,它實際上呈現了這個html的 – user1039490