Teve problemas em fazer mocks do ILogger em testes unitários? use “FakeLogger”.
Para quem realiza testes unitários utilizando NSubstitute e .NET é bem comum ter dificuldades para realizar os testes unitários para mensagens de Log, uma vez que o Logger possui algumas particularidades que a biblioteca NSubstitute não realiza muito bem.
Há uma série de postagens reclamando disto no StackOverflow onde em geral mensagens como esta abaixo aparecem:
Message: NSubstitute.Exceptions.ReceivedCallsException : Expected to receive a call matching:
Log<Object>(Error, 0, Test Exception, <null>, Func<Object, Exception, String>)
Actually received no matching calls.
Received 1 non-matching call (non-matching arguments indicated with '*' characters):
Log<Object>(Error, 0, *Test Exception*, <null>, Func<Object, Exception, String>)
A partir do .NET 8, a Microsoft implementou a classe FakeLogger visando facilitar os testes unitários para o Logger !
O FakeLogger
é um logger in-memory projetado especificamente para testes unitários. Ele permite capturar e inspecionar as mensagens de log geradas pelo código sob teste, facilitando a verificação de que o logging está funcionando corretamente.
Quais são os benefícios:
Funcionalidades:
- Capturar todas as mensagens de log em memória.
- Permitir a inspeção dessas mensagens para verificar se o código está logando corretamente.
- Controlar os níveis de log para testes mais precisos.
Benefícios:
- Facilidade de uso.
- Isolar o código sob teste.
- Melhorar a qualidade dos testes unitários.
- Evitar a “reinvenção da roda” pois muitas soluções aparecem em postagens com implementações diferentes para mocks do ILogger e solução deste problema.
Exemplo prático
1- Instale o pacote
Para instalar o pacote use o “Nuget Package Manager”
ou simplesmente rode a linha de comando abaixo:
dotnet add package Microsoft.Extensions.Diagnostics.Testing
Uma vez instalado o pacote vamos ao código:
Na classe onde estão os testes, instancie o FakeLogger conforme demonstrado na imagem abaixo.
Depois de implementado o objeto _logger, veja que ele foi enviado ao instanciar o objeto “StoreRepository” para que funcione como se fosse o Logger da classe.
Então agora é só escrever os testes unitários, a importância de monitorar o log é certificar-se que as mensagens corretas sejam inseridas no retorno, veja o exemplo:
Na linha 66, verificamos que não é nulo o retorno do Logger.
Na linha 67, verificamos a quantidade de itens coletados pelo logger (mensagens que seriam escritas).
Na linha 68, temos a verificação de que o último log é um log do tipo “Error”.
E finalmente, na linha 69, verificamos se a última mensagem, contem a frase constante na variável “CreateError” da classe “StoreMessageConstants”.
Então agora, você já sabe minimamente obter as mensagens de log e trabalhar com elas para certificar-se que os retornos dos seus serviços sejam os esperados em casos de erros. Caso queira aprofundar-se mais neste objeto, siga as referências inseridas ao final deste post.
Gostou do artigo? clique no ícone👏e me siga para ver as próximas publicações !! Quer ver mais conteúdos, acesse minhas redes através do Linktree: https://linktree.com/nizzola
Referências:
FakeLogger<T> Class (Microsoft.Extensions.Logging.Testing) | Microsoft Learn
How to Use FakeLogger to Test Logging Code in .NET — Code Maze