Assert.Throws
zwraca zgłoszony wyjątek, który pozwala potwierdzić ten wyjątek.
var ex = Assert.Throws<Exception>(() => user.MakeUserActive());
Assert.That(ex.Message, Is.EqualTo("Actual exception message"));
Jeśli więc nie zostanie zgłoszony żaden wyjątek lub zgłoszony zostanie wyjątek niewłaściwego typu, pierwsze Assert.Throws
potwierdzenie zakończy się niepowodzeniem. Jeśli jednak zostanie zgłoszony wyjątek odpowiedniego typu, możesz teraz potwierdzić faktyczny wyjątek zapisany w zmiennej.
Korzystając z tego wzorca, możesz potwierdzić inne rzeczy niż komunikat wyjątku, np. W przypadku ArgumentException
i pochodnych możesz potwierdzić, że nazwa parametru jest poprawna:
var ex = Assert.Throws<ArgumentNullException>(() => foo.Bar(null));
Assert.That(ex.ParamName, Is.EqualTo("bar"));
Możesz również użyć płynnego interfejsu API do wykonywania tych zapewnień:
Assert.That(() => foo.Bar(null),
Throws.Exception
.TypeOf<ArgumentNullException>()
.With.Property("ParamName")
.EqualTo("bar"));
lub alternatywnie
Assert.That(
Assert.Throws<ArgumentNullException>(() =>
foo.Bar(null)
.ParamName,
Is.EqualTo("bar"));
Mała wskazówka przy potwierdzaniu komunikatów o wyjątkach polega na udekorowaniu metody testowej, SetCultureAttribute
aby upewnić się, że komunikat o błędzie używa oczekiwanej kultury. Ma to zastosowanie w przypadku przechowywania wiadomości wyjątków jako zasobów umożliwiających lokalizację.
Możesz teraz używać
ExpectedException
atrybutów, npźródło
Assert.Throw
możesz kierować na dokładnie tę linię, którą jesteś zainteresowany.źródło
Assert.That(myTestDelegate, Throws.ArgumentException .With.Property(nameof(ArgumentException.Message)).EqualTo("your argument is invalid."));
Exception.Message
. Nadal zalecałbym przynajmniej dodanie tej alternatywy, ponieważWith.Property
można ją wykorzystać również na innych obiektach, które w tym przypadku poprawiłyby stabilność kodu.To jest stare, ale istotne pytanie z nieaktualnymi odpowiedziami, więc dodaję bieżące rozwiązanie:
To działa z
using Microsoft.VisualStudio.TestTools.UnitTesting;
źródło
Aby rozwinąć odpowiedź na trwałe i zapewnić większą funkcjonalność NUnit, możesz to zrobić:
Przykłady:
źródło
Rozumiem, że od dawna nie było tego problemu, ale ostatnio natknąłem się na to samo i zasugerowałem tę funkcję dla MSTest:
stosowanie:
Więcej tutaj: http://phejndorf.wordpress.com/2011/02/21/assert-that-a-particular-exception-has-occured/
źródło
Ponieważ przeszkadza mi gadatliwość niektórych nowych wzorców NUnit, używam czegoś takiego do tworzenia kodu, który jest dla mnie czystszy:
Użycie jest wtedy:
źródło