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.Mocks
và MvcFakes
từ Stephenwalther.com
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
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