ASP.NET MVC - модульное тестирование RenderPartialViewToString() с Moq Framework?
Я использую этот вспомогательный метод, чтобы превратить мой PartialViewResult в строку и вернуть его как Json - http://www.atlanticbt.com/blog/asp-net-mvc-using-ajax-json-and-partialviews/
Моя проблема в том, что я использую Moq для макетирования контроллера, и всякий раз, когда я запускаю модульное тестирование, использующее этот метод RenderPartialViewToString(), я получаю "Ссылка на объект не установлена на экземпляр объекта". ошибка в ControllerContext.
private ProgramsController GetController()
{
var mockHttpContext = new Mock<ControllerContext>();
mockHttpContext.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("test");
mockHttpContext.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
// Mock Repositories
var mockOrganizationRepository = new MockOrganizationRepository(MockData.MockOrganizationsData());
var mockIRenderPartial = new BaseController();
var controller = new ProgramsController(mockOrganizationRepository, mockIRenderPartial);
controller.ControllerContext = mockHttpContext.Object;
return controller;
}
Это возвращает прокси-контроллер, и, возможно, это причина, по которой я получил эту ошибку. Любая идея, как это модульное тестирование?
Большое спасибо.
1 ответ
Решение
Попробуй это:
public static void SetContext(this Controller controller)
{
var httpContextBase = new Mock<HttpContextBase>();
var httpRequestBase = new Mock<HttpRequestBase>();
var respone = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var routes = new RouteCollection();
RouteConfigurator.RegisterRoutesTo(routes);
httpContextBase.Setup(x => x.Response).Returns(respone.Object);
httpContextBase.Setup(x => x.Request).Returns(httpRequestBase.Object);
httpContextBase.Setup(x => x.Session).Returns(session.Object);
session.Setup(x => x["somesessionkey"]).Returns("value");
httpRequestBase.Setup(x => x.Form).Returns(new NameValueCollection());
controller.ControllerContext = new ControllerContext(httpContextBase.Object, new RouteData(), controller);
controller.Url = new UrlHelper(new RequestContext(controller.HttpContext, new RouteData()), routes);
}