Odkryłem, że wydaje się, że są to dwa główne sposoby testowania wyjątków:
Assert.Throws<Exception>(()=>MethodThatThrows());
[ExpectedException(typeof(Exception))]
Który z nich byłby najlepszy? Czy jedna oferuje przewagę nad drugą? Czy jest to po prostu kwestia osobistych preferencji?
Assert.That(() => MethodThatThrows(), Throws.Exception)
ExpectedException
atrybutu, więc w przypadku wersji 3+Assert.Throws
istotny jest tylko wariant.Odpowiedzi:
Pierwsza umożliwia testowanie pod kątem więcej niż jednego wyjątku z wieloma wywołaniami:
Druga pozwala tylko na przetestowanie jednego wyjątku na funkcję testową.
źródło
Assert.Throws
.Główna różnica to:
ExpectedException()
Atrybut sprawia, że test przechodzi pomyślnie, jeśli wyjątek wystąpi w dowolnym miejscu metody testowej.Użycie
Assert.Throws()
pozwala określićexact
miejsce kodu, w którym oczekiwany jest wyjątek.NUnit 3.0
ExpectedException
całkowicie rezygnuje z oficjalnego wsparcia .Dlatego zdecydowanie wolę używać
Assert.Throws()
metody niżExpectedException()
atrybutu.źródło
Wolę assert.throws, ponieważ umożliwia mi weryfikację i zapewnienie innych warunków po zgłoszeniu wyjątku.
źródło
Możesz również silnie wpisać oczekiwany błąd (jak stara wersja atrybutu).
źródło
Jeśli używasz starszej wersji ( <= 2.0 )
NUnit
, musisz użyćExpectedException
.Jeśli używasz wersji 2.5 lub nowszej, możesz użyć
Assert.Throw()
https://github.com/nunit/docs/wiki/Breaking-Changes
Jak używać: https://www.nunit.org/index.php?p=exceptionAsserts&r=2.5
źródło