如果您查看此链接上的示例:

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的实现)。

10-06 12:55