寻找方向的单元测试控制器扩展呈现的局部视图 [英] Looking for direction on unit testing a controller extension that renders a partial view

查看:107
本文介绍了寻找方向的单元测试控制器扩展呈现的局部视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

正如标题所说,我对如何正确测试控制器扩展寻找方向。扩展使得这反过来我使用一个JSONResult内的局部视图:

 公共静态字符串RenderPartialViewToString(此控制器控制器,字符串的viewName = NULL,对象模型= NULL)
        {
            如果(string.IsNullOrEmpty(的viewName))
            {
                的viewName = controller.ControllerContext.RouteData.GetRequiredString(行动);
            }            controller.ViewData.Model =模型;            使用(StringWriter的SW =新的StringWriter())
            {
                ViewEngineResult的ViewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext,的viewName);
                ViewContext viewContext =新ViewContext(controller.ControllerContext,viewResult.View,controller.ViewData,controller.TempData,SW);
                viewResult.View.Render(viewContext,SW);
                返回sw.GetStringBuilder()的ToString()。
            }
        }

实例:

 公共JsonResult美孚()
{
    VAR模型= _repository.getSomeData();    返回JSON(新{HTML = this.RenderPartialViewToString(「指数」,型号)},JsonRequestBehavior.AllowGet);
}

我使用NUnit和放大器; MvcContrib测试帮手,但是建立一个控制器,使得使用这个扩展我跑的时候成NRE。我假设控制器上下文不正确设置?

最后的测试barfing在 ViewEngines.Engines.FindPartialView 。下面是失败的测试的一部分:

  VAR的RouteData =新的RouteData();
routeData.Values​​.Add(控制器,someName);
routeData.Values​​.Add(行动,someAction);VAR建设者=新TestControllerBuilder();
VAR控制器=新ListingController(repository.Object);
builder.RouteData =的RouteData;
builder.InitializeController(控制器);VAR的结果= controller.Foo();


解决方案

您将有一个嘲笑视图引擎添加到 ViewEngines.Engines 集合让你可以嘲笑在FindPartialView电话。下面是与犀牛嘲笑一个例子:

  VAR视图= MockRepository.GenerateStub<&IVIEW GT;();
VAR引擎= MockRepository.GenerateStub< IViewEngine>();
VAR viewEngineResult =新ViewEngineResult(视图引擎);
发动机
    .Stub(X => x.FindPartialView(NULL,NULL,FALSE))
    .IgnoreArguments()
    .Return(viewEngineResult);
ViewEngines.Engines.Add(发动机);

然后,你可以断言,view.Render方法被调用,拦截它的参数和一些嘲笑写数据到这个作家和最后断言,你的控制器操作返回此嘲笑字符串。

As the title says, I'm looking for direction on how to properly test a controller extension. The extension renders a partial view which in turn I'm using within a JSONResult:

 public static string RenderPartialViewToString(this Controller controller, string viewName = null, object model = null)
        {
            if (string.IsNullOrEmpty(viewName))
            {
                viewName = controller.ControllerContext.RouteData.GetRequiredString("action");
            }

            controller.ViewData.Model = model;

            using (StringWriter sw = new StringWriter())
            {
                ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
                ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);
                return sw.GetStringBuilder().ToString();
            }
        }

Example usage:

public JsonResult Foo()
{
    var model = _repository.getSomeData();

    return Json(new { html = this.RenderPartialViewToString("Index", model) }, JsonRequestBehavior.AllowGet);
}

I'm using NUnit & the MvcContrib test helper, however when setting up a controller that makes use of this extension I'm running into a NRE. I'm assuming that the controller context is not setup correctly?

Ultimately the test is barfing on ViewEngines.Engines.FindPartialView. Here is a portion of the failing test:

var routeData = new RouteData();
routeData.Values.Add("controller", "someName");
routeData.Values.Add("action", "someAction");

var builder = new TestControllerBuilder();
var controller = new ListingController(repository.Object);
builder.RouteData = routeData;
builder.InitializeController(controller);

var result = controller.Foo();

解决方案

You will have to add a mocked view engine to the ViewEngines.Engines collection so that you can mock the FindPartialView call. Here's an example with Rhino Mocks:

var view = MockRepository.GenerateStub<IView>();
var engine = MockRepository.GenerateStub<IViewEngine>();
var viewEngineResult = new ViewEngineResult(view, engine);
engine
    .Stub(x => x.FindPartialView(null, null, false))
    .IgnoreArguments()
    .Return(viewEngineResult);
ViewEngines.Engines.Add(engine);

Then you could assert that the view.Render method was called, intercept its arguments and write some mocked data to this writer and finally assert that your controller action returned this mocked string.

这篇关于寻找方向的单元测试控制器扩展呈现的局部视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆