.NET

2 mai, 2023

Mocking Test em .NET 7: exemplo utilizando Moq, xUnit e Fluent Assertions

Publicidade

Neste artigo apresento um exemplo de uso de Mock Objects em .NET 7, tomando como base um projeto criado originalmente em versões anteriores do .NET e detalhado em um artigo publicado há algum tempo no meu blog:

Testes de Software com .NET 5: exemplos de utilização

A implementação em questão utilizou o Moq como alternativa para a manipulação de Mock Objects, além de se basear no xUnit e empregar ainda o framework Fluent Assertions. Já disponibilizei inclusive este exemplo no GitHub:

https://github.com/renatogroffe/DotNet7-Moq-xUnit-FluentAssertions_AnaliseCredito

Caso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!

Partindo da interface IServicoConsultaCredito:

E do enum StatusConsultaCredito e da classe Pendencia, construções utilizadas pela interface IServicoConsultaCredito:

Teremos o uso dessas estruturas pela classe AnaliseCredito:

E como poderíamos então gerar um objeto por meio da interface IServicoConsultaCredito, sem que contemos com uma implementação da mesma?

A resposta está no uso da classe genérica Mock (namespace Moq), disponibilizada pelo Moq para a criação de Mock Objects. A listagem seguinte exemplifica tudo isso, com a configuração de mapeamentos no construtor do tipo TestesAnaliseCredito e o uso de um Mock Object simulando as condições possíveis a serem tratadas por AnaliseCredito:

using Moq;
using FluentAssertions;
namespace ConsultaCredito.Testes;
public class TestesAnaliseCredito
{
private readonly Mock<IServicoConsultaCredito> mock;
private const string CPF_INVALIDO = “123A”;
private const string CPF_ERRO_COMUNICACAO = “76217486300”;
private const string CPF_SEM_PENDENCIAS = “60487583752”;
private const string CPF_INADIMPLENTE = “82226651209”;
public TestesAnaliseCredito()
{
mock = new(MockBehavior.Strict);
mock.Setup(s => s.ConsultarPendenciasPorCPF(CPF_INVALIDO))
.Returns(() => null);
mock.Setup(s => s.ConsultarPendenciasPorCPF(CPF_ERRO_COMUNICACAO))
.Throws(exception: new(“Testando erro de comunicacao”));
mock.Setup(s => s.ConsultarPendenciasPorCPF(CPF_SEM_PENDENCIAS))
.Returns(() => new List<Pendencia>());
var pendencias = new List<Pendencia>()
{
new ()
{
CPF = CPF_INADIMPLENTE,
NomePessoa = “Cliente Teste”,
NomeReclamante = “Empresas ACME”,
DescricaoPendencia = “Parcela nao paga”,
VlPendencia = 900.50
}
};
mock.Setup(s => s.ConsultarPendenciasPorCPF(CPF_INADIMPLENTE))
.Returns(() => pendencias);
}
private StatusConsultaCredito ObterStatusAnaliseCredito(string cpf)
{
AnaliseCredito analise = new(mock.Object);
return analise.ConsultarSituacaoCPF(cpf);
}
[Fact]
[Trait(“CPF Invalido”, “Simular”)]
public void TestarCPFInvalidoMoq()
{
StatusConsultaCredito status =
ObterStatusAnaliseCredito(CPF_INVALIDO);
status.Should().Be(StatusConsultaCredito.ParametroEnvioInvalido,
“Resultado incorreto para um CPF invalido”);
}
[Fact]
[Trait(“Erro Comunicacao”, “Simular”)]
public void TestarErroComunicacaoMoq()
{
StatusConsultaCredito status =
ObterStatusAnaliseCredito(CPF_ERRO_COMUNICACAO);
status.Should().Be(StatusConsultaCredito.ErroComunicacao,
“Resultado incorreto para um erro de comunicacao”);
}
[Fact]
[Trait(“Sem Pendencias”, “Simular”)]
public void TestarCPFSemPendenciasMoq()
{
StatusConsultaCredito status =
ObterStatusAnaliseCredito(CPF_SEM_PENDENCIAS);
status.Should().Be(StatusConsultaCredito.SemPendencias,
“Resultado incorreto para um CPF sem pendencias”);
}
[Fact]
[Trait(“Inadimplente”, “Simular”)]
public void TestarCPFInadimplenteMoq()
{
StatusConsultaCredito status =
ObterStatusAnaliseCredito(CPF_INADIMPLENTE);
status.Should().Be(StatusConsultaCredito.Inadimplente,
“Resultado incorreto para um CPF inadimplente”);
}
}

Esse exemplo foi apresentado em detalhes em uma live recente no Microsoft Reactor, com o conteúdo podendo ser assistido gratuitamente no YouTube:

*O conteúdo deste artigo é de responsabilidade do(a) autor(a) e não reflete necessariamente a opinião do iMasters.