Противоречивые результаты при модульном тестировании контроллера MVC - PullRequest
0 голосов
/ 21 марта 2011

Я пишу юнит-тесты (используя NUnit & Moq) для моих контроллеров MVC 2 и следую примерам в книге Pro ASP.net MVC 2 Framework Стивена Сандерсона (отличная книга, кстати). Однако я столкнулся с проблемами, которые, по-моему, связаны только с моим непониманием NUnit.

Вот выдержка с удаленными несоответствующими частями:

[Test]
public void Cannot_Save_Invalid_Event()
{
    ...

    repository.Setup(x => x.SaveEvent(evt)).Callback(Assert.Fail);

    ...

    repository.Verify(x => x.SaveEvent(evt));
}

Этот тест проходит для меня, хотя, насколько я понимаю, эти два утверждения должны прямо противоречить друг другу. Первоначально второго там не было, но я вставил его, чтобы убедиться, что он проходил по правильным причинам.

Насколько я понимаю, мой репозиторий настроен как сбой, если вызывается "repository.SaveEvent (evt)". Однако позже в тесте я пытаюсь убедиться, что был вызван «repository.SaveEvent (evt)». Раз это проходит, не значит ли это, что он был как вызван, так и не вызван? Возможно, эти заявления не действуют так, как я подозреваю.

Может ли кто-нибудь объяснить, почему эти два утверждения не являются противоположностями, и как они могут существовать и пройти тест?

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Причиной такого поведения было то, что он выполнял «SaveEvent ()», однако, поскольку в смоделированном репозитории не определялось это действие, оно выдавало исключение в моем контроллере, который ловил мой контроллер.

Итак, кажется, что обратный вызов будет выполняться только в случае успешного возврата управления.

0 голосов
/ 22 марта 2011

Может быть, ваши тесты не терпят неудачу, потому что в нем есть блок catch-everything, который также скрывает исключение assert / verify-exception, необходимое для сбоя теста.

Примечание: следующий unittest всегда будет проходить

[Test]
public void HidingAssertionFailure()
{
    try {
        Assert.AreEqual(0,1); // this should fail
    } catch (Exception ex) {
        // this will hide the assertion failure
    }
}
...