Teve problemas em fazer mocks do ILogger em testes unitários? use “FakeLogger”.

Marcio Nizzola
3 min readDec 5, 2024

--

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

--

--

Marcio Nizzola
Marcio Nizzola

Written by Marcio Nizzola

Microsoft MVP | Software Architect na CI&T | Prof. da Etec Itu | Membro Fundador da Comunidade Itu Developers.

No responses yet