如果您查看此链接上的示例:
http://www.atlanticbt.com/blog/asp-net-mvc-using-ajax-json-and-partialviews/
一个人如何编写JsonAdd方法的单元测试?我自己的代码中有类似的情况,但是调用时出现RenderPartialViewToString错误:
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView
我尝试过各种不同的尝试来对调用无效的方法进行存根。任何帮助表示赞赏。谢谢。
最佳答案
由于ViewEninges是静态类,因此无法使用RhinoMocks对其进行模拟。我认为您最好的选择是创建“部分视图渲染器”界面。接口是可模拟的,因此您可以消除渲染视图的复杂性。这是一些快速的伪代码。
首先,定义部分视图渲染器接口:
public interface IRenderPartialView
{
string Render(string viewName, object model);
}
然后,将基类的RenderPartialViewToString更改为IRenderPartialView.Render的实现:
public abstract class BaseController : Controller, IRenderPartialView
{
...
public string Render(string viewName, object model)
{
// same code as RenderPartialViewToString
}
}
现在我们需要更改您的控制器构造函数,以便可以在测试期间注入IRenderPartialView,但是在生产过程中使用基类。我们可以通过使用一对构造函数来实现:
public class YourController : BaseController
{
private IRenderPartialView partialRenderer;
public YourController()
{
SetRenderer(this);
}
public YourController(IRenderPartialView partialRenderer)
{
SetRenderer(partialRenderer);
}
private void SetRenderer(IRenderPartialView partialRenderer)
{
this.partialRenderer = this;
}
}
现在,JsonAdd可以调用部分视图渲染器:
public JsonResult JsonAdd(AddPersonViewModel AddPersonModel)
{
...
return Json(new
{
Success = true,
Message = "The person has been added!",
PartialViewHtml = partialRenderer.Render("PersonList", new PersonListViewModel {PersonList = _personList})
});
}
因此,在测试过程中,您将模拟出
IRenderPartialView
并将其发送到接受IRenderPartialView
的构造函数。在生产过程中,当ASP.NET MVC调用默认构造函数时,它将使用控制器作为渲染器(在基类中具有IRenderPartialView.Render
的实现)。