2011-11-10 95 views
8

我想(單元)測試函數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嘲諷和MvcFakesStephenwalther.com

+1

也許它試圖從不會被設置的線程讀取'HttpContext.Current'。你爲什麼要單元測試這個?嘗試下載MVC源代碼 - 您應該在那裏找到微軟現有的單元測試。 – Rup

+0

我已經看到了一篇文章。 此視圖用於網站和電子郵件與文章推薦。 但是這兩個調用之間的html差別不大。 現在我想編寫一個測試來檢查這兩個調用的視圖。 也許我沒有在mvc項目文件中找到正確的單元測試,但是我沒有得到一個測試,它實際上呈現了這個html的 – user1039490

回答

1

我認爲this thread可以幫助你,你必須嘲笑ViewEngine然後嘲笑FindPartialView電話。

+2

IIRC,它是它所嵌入的FindPartialView調用 - 他想模擬足夠的周圍類所以他可以運行真正的FindPartialView代碼,而不是模擬它。 – Rup