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.
Agora você pode usar os
ExpectedException
atributos, por exemplofonte
Assert.Throw
você pode direcionar a linha exato que você está interessado.fonte
Assert.That(myTestDelegate, Throws.ArgumentException .With.Property(nameof(ArgumentException.Message)).EqualTo("your argument is invalid."));
Exception.Message
. Eu ainda recomendaria adicionar pelo menos essa alternativa, porque tambémWith.Property
pode ser utilizada em outros objetos, os quais, nesse caso, melhorariam a estabilidade do código.Esta é uma pergunta antiga, mas relevante, com respostas desatualizadas, por isso estou adicionando a solução atual:
Isso funciona com
using Microsoft.VisualStudio.TestTools.UnitTesting;
fonte
Para expandir a resposta do persistente e fornecer mais funcionalidades do NUnit, você pode fazer o seguinte:
Exemplos:
fonte
Percebi que já faz muito tempo que esse problema foi levantado, mas recentemente me deparei com a mesma coisa e sugiro esta função para o MSTest:
uso:
Mais aqui: http://phejndorf.wordpress.com/2011/02/21/assert-that-a-particular-exception-has-occured/
fonte
Como estou incomodado com a verbosidade de alguns dos novos padrões da NUnit, uso algo assim para criar código mais limpo para mim:
O uso é então:
fonte