it-swarm.com.ru

Использовать метод NUnit Assert.Throws или атрибут ExpectedException?

Я обнаружил, что это два основных способа проверки исключений:

Assert.Throws<Exception>(()=>MethodThatThrows());

[ExpectedException(typeof(Exception))]

Какой из них будет лучше? Предлагает ли одно преимущество перед другим? Или это просто вопрос личных предпочтений? 

133
SamuelDavis

Первый позволяет тестировать более одного исключения с несколькими вызовами:

Assert.Throws(()=>MethodThatThrows());
Assert.Throws(()=>Method2ThatThrows());

Второе позволяет вам проверить только одно исключение для каждой тестовой функции.

81
chue x

Основным отличием является:

Атрибут ExpectedException() делает тест пройденным, если исключение происходит в any месте в методе test.
Использование Assert.Throws() позволяет указать exact место кода, где ожидается исключение.

NUnit 3.0 полностью исключает официальную поддержку ExpectedException.

Поэтому я определенно предпочитаю использовать метод Assert.Throws(), а не атрибут ExpectedException().

241
Alexander Stepaniuk

Я предпочитаю assert.throws, так как он позволяет мне проверять и утверждать другие условия после исключения.

    [Test]
    [Category("Slow")]
    public void IsValidLogFileName_nullFileName_ThrowsExcpetion()
    {
        // the exception we expect thrown from the IsValidFileName method
        var ex = Assert.Throws<ArgumentNullException>(() => a.IsValidLogFileName(""));

        // now we can test the exception itself
        Assert.That(ex.Message == "Blah");

    }
33
Mike Parkhill

Вы также можете строго ввести ожидаемую ошибку (например, старую версию attrib).

Assert.Throws<System.InvalidOperationException>(() => breakingAction())
9
Reverend Sfinks

Если вы используете более старую версию (<= 2.0) NUnit, тогда вам нужно использовать ExpectedException

Если вы используете 2.5 или более позднюю версию, тогда вы можете использовать Assert.Throw()

https://github.com/nunit/docs/wiki/Breaking-Changes

Как использовать: https://www.nunit.org/index.php?p=exceptionAsserts&r=2.5

0
Gireesh k