Зависимости модульного теста для подкласса ASP.NET MVC 3 ViewResult
Я создаю действительно простой ViewResult
подкласс называется JavaScriptViewResult
что при выполнении вызывает базовую реализацию и затем устанавливает Content-Type
ответа на text/javascript
, Пытаясь провести модульное тестирование этого класса, я сталкиваюсь с множеством трудностей, удовлетворяющих всем зависимостям стека ASP.NET MVC.
Вот как выглядит мой модульный тест, использующий Rhino:
[TestMethod]
public void TestExecuteAction()
{
var request = MockRepository.GenerateMock<HttpRequestBase>();
request.Expect(m => m.Url).Return(new Uri("/Test/JavaScript", UriKind.Relative));
var httpContext = MockRepository.GenerateMock<HttpContextBase>();
httpContext.Expect(m => m.Request).Return(request);
var controller = MockRepository.GenerateMock<ControllerBase>();
var virtualPathProvider = MockRepository.GenerateMock<VirtualPathProvider>();
var routeCollection = new RouteCollection(virtualPathProvider);
routeCollection.MapRoute("FakeRoute", "Test/JavaScript", new { controller = "Test", action = "JavaScript" });
var routeData = routeCollection.GetRouteData(httpContext);
var context = new ControllerContext(httpContext, routeData, controller);
var viewResult = new JavaScriptViewResult();
viewResult.ExecuteResult(context);
Assert.AreEqual("text/javascript", context.HttpContext.Response.ContentType);
}
Последнее исключение при запуске теста NullReferenceException
глубоко в недрах System.Web.Routing.Route.GetRouteData(HttpContextBase httpContext)
,
Как мне установить все зависимости для выполнения ViewResult
? Существуют ли способы сделать это проще? Альтернативно, есть ли другой способ, которым я могу использовать механизм представления MVC для генерации JavaScript, который установит правильную Content-Type
за ответ?
1 ответ
Я выяснил, как выполнить минимальные требования ViewResult
, Одна проблема, с которой я столкнулся, была насмешка над процессом нахождения вида. Этого можно было избежать, гарантируя, что View
собственность моего объекта была заселена. Вот мой рабочий тест:
[TestMethod]
public void TestExecuteAction()
{
var response = MockRepository.GenerateStub<HttpResponseBase>();
response.Output = new StringWriter();
var httpContext = MockRepository.GenerateMock<HttpContextBase>();
httpContext.Expect(m => m.Response).Return(response);
var routeData = new RouteData();
routeData.Values.Add("action", "FakeAction");
var context = new ControllerContext(httpContext, routeData, MockRepository.GenerateMock<ControllerBase>());
var viewResult = new JavaScriptViewResult();
viewResult.View = MockRepository.GenerateMock<IView>();
viewResult.ExecuteResult(context);
Assert.AreEqual("text/javascript", context.HttpContext.Response.ContentType);
}