Поскольку 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
внутри базового класса).