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.