Как правильно использовать юнит-тестирование ViewEngines.Engines.FindView? - PullRequest
4 голосов
/ 31 июля 2010

Недавно я провел некоторый рефакторинг своего приложения mvc и понял, что возвращено много статических представлений. Вместо нескольких контроллеров с результатами действий, которые возвращают только представление, я решил создать один контроллер, который возвращает статические представления, если они существуют, и выдает ошибку 404, если представление не существует.

public ActionResult Index(string name)
{
    ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null);

    if (result.View == null)
        ThrowNotFound("Page does not exists.");

    return View(name);
}

Мой вопрос: как правильно это тестировать? Я попробовал следующий код, но я получаю сообщение об ошибке: «RouteData должен содержать элемент с именем« controller »с непустым строковым значением».

[Theory]
[InlineData("ContactUs")]
public void Index_should_return_view_if_view_exists(string name)
{
    controller = new ContentController();
    httpContext = controller.MockHttpContext("/", "~/Content/Index", "GET"); ;

    var result = (ViewResult)controller.Index(name);

    Assert.NotNull(result.View);
}

Мое намерение состояло в том, чтобы модульный тест вышел и получил реальное представление. Затем я начал задаваться вопросом, должен ли я издеваться над ViewEngines с помощью SetupGet для FindView и создавать два теста, где второй тест проверяет, что исключение не найдено, если представление является нулевым.

Как правильно проверить эту функциональность? Любые указатели, примеры кода или сообщения в блоге будут полезны.

Спасибо

1 Ответ

4 голосов
/ 31 июля 2010

Вы должны создать движок мнимого представления и поместить его в коллекцию:

[Theory]
[InlineData("ContactUs")]
public void Index_should_return_view_if_view_exists(string name)
{
    var mockViewEngine = MockRepository.GenerateStub<IViewEngine>();
    // Depending on what result you expect you could set the searched locations
    // and the view if you want it to be found
    var result = new ViewEngineResult(new [] { "location1", "location2" });
    // Stub the FindView method
    mockViewEngine
        .Stub(x => x.FindView(null, null, null, false))
        .IgnoreArguments()
        .Return(result);
    // Use the mocked view engine instead of WebForms
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(mockViewEngine);

    controller = new ContentController();

    var actual = (ViewResult)controller.Index(name);

    Assert.NotNull(actual.View);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...