Ожидаемое исключение в NUnit SetUp - PullRequest
1 голос
/ 19 ноября 2010

Я использую NUnit и Rhino Mocks. Я использую AAA-синтаксис и делаю Arrange и Act в методе setup, и каждый метод Test является Assert.

[TestFixture]
public class When_subSystem_throws_exception
{
    SomeClass subject; // System under test

    [SetUp]
    public void Setup()
    {
        // Arrange
        IDependency dependency = MockRepository.GenerateStub<IDependency>();
        dependency.Stub(m => m.DoStuff()).Throw(new Exception()); // This method is called from within SomeMethod()

        subject = new SomeClass(dependency);

        // Act
        subject.SomeMethod("Invalid Input");
    }

    // Assert

    [Test]
    public void should_log_an_exception_to_the_logger()
    {
        // Do stuff to verify that an exception has been logged
    }

    // More tests
}

Как и следовало ожидать, код SomeMethod () выдает исключение (как и ожидалось), которое делает каждый тест неудачным (нежелательным). Я обойти это, делая

try
{
    // Act
    subject.SomeMethod("Invalid Input");
}
catch(Exception ex)
{
    // Swallow, this exception is expected.
}

Но это просто ужасно.

То, что я хотел бы сделать, это

[SetUp]
[ExpectedException]  // <-- this works for Test methods, but not for SetUp methods
public void Setup()
{
    // etc...
}

но я не могу найти ничего подобного.

Знаете ли вы что-нибудь?

Ответы [ 3 ]

2 голосов
/ 19 ноября 2010

Я не думаю, что использование таких атрибутов, как ExpectedException - хорошая идея. SetUp - подготовить что-то для тестовых методов, оно не должно вызывать исключения. Если оно должно скинуть, и вы хотите ограничить номер строки кода. Затем поместите их в одну строку, как показано ниже:

try { subject.SomeMethod("Invalid Input"); }catch { }
2 голосов
/ 19 ноября 2010

Это не работает в программе установки по причине, а не из-за ошибки NUnit.

Это очень плохая практика для модульного теста - генерировать исключения внутри метода SetUp. Если вы тестируете конкретный сценарий, где исключение является ожидаемым результатом, это должно быть сделано внутри метода [Test]. Вы должны изменить свой код впоследствии.

1 голос
/ 19 ноября 2010

Ваш шаг "действия" должен быть в методе теста, а не в настройке.

Настройка предназначена для установки предварительных условий и общих объектов для теста (ов) - то есть общей или повторяющейся "аранжировки""steps.

Каждый метод тестирования должен" действовать "и" подтверждать "индивидуально (и могут также потребоваться дополнительные" упорядочить "шаги, специфичные для теста).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...