Como testar que o método disparou a exceção com a mensagem correta? [Dica Rápida]

Olá, pessoal

Essa é 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<MyException>(() => 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<MyException>(() => 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<T>(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?

“That’s all, folks!”

Anúncios

2 comentários em “Como testar que o método disparou a exceção com a mensagem correta? [Dica Rápida]

Participe! Vamos trocar uma ideia sobre desenvolvimento de software!

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s