Assert.Throws
retorna a exceção lançada, que permite afirmar a exceção.
var ex = Assert.Throws<Exception>(() => user.MakeUserActive());
Assert.That(ex.Message, Is.EqualTo("Actual exception message"));
Portanto, se nenhuma exceção for lançada ou uma exceção do tipo errado for lançada, a primeira Assert.Throws
asserção falhará. No entanto, se uma exceção do tipo correto for lançada, agora você poderá afirmar a exceção real que salvou na variável.
Ao usar esse padrão, você pode afirmar outras coisas além da mensagem de exceção, por exemplo, no caso de ArgumentException
e derivados, pode afirmar que o nome do parâmetro está correto:
var ex = Assert.Throws<ArgumentNullException>(() => foo.Bar(null));
Assert.That(ex.ParamName, Is.EqualTo("bar"));
Você também pode usar a API fluente para fazer as seguintes afirmações:
Assert.That(() => foo.Bar(null),
Throws.Exception
.TypeOf<ArgumentNullException>()
.With.Property("ParamName")
.EqualTo("bar"));
ou alternativamente
Assert.That(
Assert.Throws<ArgumentNullException>(() =>
foo.Bar(null)
.ParamName,
Is.EqualTo("bar"));
Uma pequena dica ao declarar mensagens de exceção é decorar o método de teste com o SetCultureAttribute
para garantir que a mensagem lançada esteja usando a cultura esperada. Isso entra em jogo se você armazenar suas mensagens de exceção como recursos para permitir a localização.