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