Зависимости модульного теста для подкласса ASP.NET MVC 3 ViewResult - PullRequest
3 голосов
/ 29 декабря 2011

Я создаю действительно простой подкласс ViewResult с именем JavaScriptViewResult, который при выполнении вызывает базовую реализацию и затем устанавливает Content-Type ответа на text/javascript.Пытаясь провести модульное тестирование этого класса, я сталкиваюсь с множеством трудностей, выполняя все зависимости стека ASP.NET MVC.

Вот как выглядит мой модульный тест, использующий Rhino:far:

[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 Ответ

4 голосов
/ 29 декабря 2011

Я понял, как выполнить минимальные требования 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);
}
...