测试函数"System.Web.Mvc.ViewEngines.Engines.FindPartialView"

use*_*490 8 c# unit-testing rhino-mocks razor asp.net-mvc-3

我想(单元)测试函数System.Web.Mvc.ViewEngines.Engines.FindPartialView并检查HTML代码的正确返回.

但每次我开始单元测试时,都会抛出"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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试:

    [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);
            (...)
        }
Run Code Online (Sandbox Code Playgroud)

对于我用过的嘲笑Rhino.MocksMvcFakes来自Stephenwalther.com的嘲笑

小智 1

我认为这个线程可以帮助你,你必须模拟ViewEngine然后模拟FindPartialView调用。

  • IIRC 这是他感兴趣的 FindPartialView 调用 - 他想要模拟足够的周围类,以便他可以运行真正的 FindPartialView 代码,而不是模拟它。 (3认同)