Как проверить, что вызов действия View () не выдал исключение? - PullRequest
5 голосов
/ 08 ноября 2011

Если мы нажмем SomeController.SomeAction(), но файл SomeAction.cshtml не найден, мы получим System.InvalidOperationException и сообщение об ошибке вывода ...

Представление SomeAction или его мастер не найдены, или никакой механизм просмотра не поддерживает искомые местоположения. Были найдены следующие местоположения: ... etc

Однако, даже если этот файл отсутствует, приведенный ниже тест пройдет, поскольку ViewResult все еще возвращается.

Каков наилучший способ проверить, что вызов действия View() не выдал исключение и тихо возвратил это в ViewResult контенте?


public class SomeController: Controller
{
    public ActionResult SomeAction()
    {
        var viewModel = new SomeModel();
        return View(viewModel);
    }
}

[Test]
public void TestIndex(Type clientType)
{
    var controller = new SomeController();
    var result = (ViewResult)controller.SomeAction();

    Assert.That(result, Is.TypeOf<ViewResult>());
}

ПРИМЕЧАНИЕ. Это тривиальный пример более серьезной проблемы, на данном этапе есть веские основания для проведения такого рода тестов, но это не форум для этого обсуждения.

Ответы [ 2 ]

3 голосов
/ 08 ноября 2011

По моему мнению, вы не должны пытаться утверждать, существует ли представление в модульном тесте для действия контроллера. Вам нужно проверить поведение действия контроллера, которое в этом случае довольно просто, как и должно быть. Таким образом, у вас будут тесты для:

  • Действие возвращает вид по умолчанию;
  • Действие передает правильную модель для представления.

Кроме того, в качестве идентификатора, если у вас есть тест, который преобразует результат действия в ViewResult, вы также можете явно заявить об этом и изменить тип возврата действия. Это изменение делает ваш код более понятным, а также устраняет необходимость в представленном вами примере теста, в котором есть ошибка, поскольку в случае неудачного приведения код подтверждения не достигается, а при успешном приведении подтверждение является избыточным.

1 голос
/ 08 ноября 2011

Как правило, проверка выполнения кода без ошибок является обязанностью тестов пользовательского интерфейса, а не модульных тестов. Вы можете попробовать использовать метод FindView . Вам просто нужно смоделировать ControllerContext, чтобы имитировать Http-запрос, который вы притворяетесь выполнить.

Вас также может заинтересовать последняя версия Resharper, которая довольно хорошо предупреждает вас, когда код вашего контроллера ссылается на несуществующее представление.

...