Использовать метод NUnit Assert.Throws или ExpectedException?
Я обнаружил, что это, по-видимому, два основных способа тестирования для исключений:
Assert.Throws<Exception>(()=>MethodThatThrows());
[ExpectedException(typeof(Exception))]
Какое из них было бы лучше? Предоставляет ли кто-то преимущество перед другими? Или это просто вопрос личных предпочтений?
Ответы
Ответ 1
Первое позволяет протестировать несколько исключений с несколькими вызовами:
Assert.Throws(()=>MethodThatThrows());
Assert.Throws(()=>Method2ThatThrows());
Вторая позволяет тестировать только одно исключение для каждой тестовой функции.
Ответ 2
Основное отличие:
ExpectedException()
атрибут делает тест пройденным, если исключение происходит в любом месте тестового метода.
Использование Assert.Throws()
позволяет указать exact
место кода, в котором ожидается исключение.
NUnit 3.0 полностью отказывается от официальной поддержки ExpectedException
.
Итак, я определенно предпочитаю использовать Assert.Throws()
метод вместо атрибута ExpectedException()
.
Ответ 3
Я предпочитаю 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");
}
Ответ 4
Вы также можете указать тип ошибки, которую вы ожидаете (например, старая версия атрибута).
Assert.Throws<System.InvalidOperationException>(() => breakingAction())
Ответ 5
Если вы используете более старую версию (<= 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