gpt4 book ai didi

asp.net-mvc - 寻找对呈现局部 View 的 Controller 扩展进行单元测试的方向

转载 作者:行者123 更新时间:2023-12-03 23:23:40 26 4
gpt4 key购买 nike

正如标题所说,我正在寻找有关如何正确测试 Controller 扩展的方向。该扩展呈现了一个局部 View ,而我又在 JSONResult 中使用了该 View :

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

用法示例:
public JsonResult Foo()
{
var model = _repository.getSomeData();

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

我正在使用 NUnit 和 MvcContrib test helper ,但是在设置使用此扩展的 Controller 时,我遇到了 NRE。我假设 Controller 上下文设置不正确?

最终,测试在 ViewEngines.Engines.FindPartialView 上发生。 .这是失败测试的一部分:
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();

最佳答案

您必须向 ViewEngines.Engines 添加一个模拟 View 引擎。集合,以便您可以模拟 FindPartialView 调用。这是 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);

然后你可以断言 view.Render 方法被调用,拦截它的参数并将一些模拟数据写入这个 writer,最后断言你的 Controller 操作返回了这个模拟字符串。

关于asp.net-mvc - 寻找对呈现局部 View 的 Controller 扩展进行单元测试的方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8859077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com