Apresento aqui uma dica rápida para testarmos se a mensagem retornada em uma exceção é de fato a mensagem desejada.
A forma mais popular de testarmos se uma exceção foi disparada é usarmos um assertion method específico para isso, como o exemplo com NUnit:
// fixture setup...
var ex = Assert.Throws(() => sut.DoSomething());
Assert.AreEqual("invalid operation", ex.Message);
Vejam que o Assert.Throws(), além de verificar se o método testado dispara a exceção esperada, retorna a exceção! Com isso, podemos usar outras asserções abaixo dele, para verificarmos a propriedade “Message” da exceção e quaisquer outras propriedades que desejarmos. (O xUnit.net, outro framework de testes que vem se popularizando, possui API semelhante).
Particularmente, penso que a solução acima não deixa tão claro o propósito do teste e costumo utilizar uma solução mais descritiva:
// fixture setup...
Assert.Throws(() => sut.DoSomething())
.WithMessage("invalid operation");
Para utilizarmos a solução acima, basta um simples extension method para a classe Exception (ou para a exceção customizada que você esteja usando):
public static class TestUtilityCode
{
public static void WithMessage(this T exception, string message)
where T : Exception
{
if (exception.Message.Equals(message))
Assert.Pass("Actual message matches the expected one: {0}",
message);
else
Assert.Fail("Expected: {0}\nActual: {1}",
message, exception.Message);
}
}
O extension method acima foi escrito para o NUnit, que possui os métodos Pass() e Fail(), para passar e falhar o teste imperativamente. No entanto, o código pode ser perfeitamente adaptado ao seu framework de preferência.
Simples e expressivo, não?
E você, como costuma fazer esse tipo de asserção?
No NUnit 3.x, faço da seguinte forma:
https://gist.github.com/carlosschults/ee9cca1221d4c51d845daa06733c10fd
CurtirCurtir
Bacana, Carlos. Nunca fiz dessa forma. Obrigado por compartilhar!
CurtirCurtir