Тъй като 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