2011-11-10 14 views
8

Tôi muốn (đơn vị) kiểm tra hàm System.Web.Mvc.ViewEngines.Engines.FindPartialView và kiểm tra trả lại mã HTML chính xác.Kiểm tra chức năng "System.Web.Mvc.ViewEngines.Engines.FindPartialView"

Nhưng mỗi khi tôi bắt đầu kiểm tra đơn vị, nó ném một ngoại lệ "Object reference not set to an instance of an object".

Tôi đã cố gắng gỡ lỗi thông qua nguồn khung .net nhưng trình gỡ lỗi bị mất phương hướng và nhảy ngẫu nhiên/ngắt mà không có thông báo.

Bây giờ tôi muốn biết phần tử nào tôi đã bỏ lỡ trong FakeControllerContext và cách khắc phục.

Dưới đây là Mã của tôi:

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(); 
    } 
} 

Và đây là thử nghiệm của tôi:

[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); 
      (...) 
     } 

Đối với mocking Tôi đã sử dụng Rhino.MocksMvcFakes từ Stephenwalther.com

+1

Có thể nó đang cố đọc 'HttpContext.Current' từ chuỗi sẽ không được đặt. Tại sao bạn muốn đơn vị kiểm tra này? Hãy thử tải về nguồn MVC - bạn sẽ tìm thấy bài kiểm tra đơn vị hiện tại của Microsoft trong đó. – Rup

+0

Tôi đã có chế độ xem cho một bài viết. Chế độ xem này được sử dụng cho trang web và cho các email có đề xuất bài viết. Nhưng có rất ít sự khác biệt trong html giữa hai cuộc gọi này. Bây giờ tôi muốn viết một bài kiểm tra để kiểm tra xem cho hai cuộc gọi này. Có lẽ tôi đã không tìm thấy bài kiểm tra đơn vị đúng trong tệp dự án mvc nhưng tôi không nhận được bài kiểm tra thực sự hiển thị html – user1039490

Trả lời

1

Tôi nghĩ rằng this thread có thể giúp bạn, bạn phải giả lập số ViewEngine rồi thử cuộc gọi FindPartialView.

+2

IIRC đó là cuộc gọi FindPartialView mà anh ta đã tham gia - anh ấy muốn giả lập đủ các lớp xung quanh để anh ta có thể chạy mã FindPartialView thực, chứ không phải giả lập nó. – Rup