Guia Completo: Stubs e Mocks para Métodos Assíncronos

Imagine que você tenha um método que faz uma chamada a um serviço externo de forma assíncrona. Para garantir que seu teste de unidade🧪 Testes de Unidade para Tratamento de Erros: Previna Falhas Futuras!🧪 Testes de Unidade para Tratamento de Erros: Previna Falhas Futuras!Descubra como implementar testes de unidade focados em tratamento de erros, evitando surpresas em produção e garantindo sistemas confiáveis e robustos. seja confiável, você não quer depender de fatores externos, como tempo de resposta da rede ou disponibilidade de um serviço remoto. É nesse cenário que entram os mocks🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. stubs, que simulam comportamentos e resultados para os métodos assíncronosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance., permitindo-lhe testar apenas o fluxo lógico do seu código.

Neste tutorial, exploraremos:

Conceitos Rápidos: Stubs e Mocks🔗

Quando falamos de métodos assíncronosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance., essas definições continuam as mesmas, mas com o adicional de que os métodos serão do tipo TaskDiferenças entre Threads, Tasks e Delegates em C#Diferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho., TaskDiferenças entre Threads, Tasks e Delegates em C#Diferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho.<T> ou similares. A biblioteca🎮 Projeto: Sistema de Gerenciamento de Biblioteca com OOP Puro!🎮 Projeto: Sistema de Gerenciamento de Biblioteca com OOP Puro!Descubra como desenvolver um sistema de biblioteca eficiente utilizando conceitos de Orientação a Objetos em C#. Mergulhe neste tutorial prático e desafiador! de teste precisa lidar com esse retorno e com a awaitabilidade do método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência..

Visão Geral do Moq e do NSubstitute🔗

Antes de partirmos para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! o uso prático, abaixo está uma pequena tabela comparativa entre as duas bibliotecas:

CaracterísticaMoqNSubstitute
Sintaxe de configuração (Setup)Usa o método .Setup(...) para especificar comportamento e retornoUsa o método .Returns(...) após a chamada esperada
Validação de chamadas (Verificação)Usa .Verify(...) para garantir se o método foi chamado corretamenteUsa .Received(...) para validar as chamadas
Operações assíncronasPermite o uso de métodos .ReturnsAsync(...) e verificações de awaitPermite .Returns(...) apontando Task ou Task<T>

Ambas as bibliotecas têm grande suporte para métodos assíncronosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance.. A principal diferença está na forma de configurar e verificar as interações.

Exemplo de Interface a ser Testada🔗

Vamos supor que temos a seguinte interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas., que representa uma comunicação com algum serviço externo de dados:

public interface IDadosService
{
    Task<string> ObterDadosAsync(int id);
}

Sua implementação real chamaria, por exemplo, uma API externa para buscar informações. Porém, para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! fins de teste, nós injetaremos um mock ou stub dessa interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. no nosso código de produção.

Criando Stubs e Mocks com Moq🔗

O Moq🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. é uma das bibliotecas mais populares para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! criação de mocks🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. em C#. Acompanhe o exemplo:

Stub de Retorno Assíncrono

Quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. precisamos apenas de um stub (um retorno pré-definido), podemos fazer o seguinte:

using Moq;
using System.Threading.Tasks;
using Xunit;
public class DadosServiceTests
{
    [Fact]
    public async Task Deve_Retornar_Dados_Fixos_Como_Stub()
    {
        // Arrange
        var mockDadosService = new Mock<IDadosService>();
        mockDadosService
            .Setup(service => service.ObterDadosAsync(It.IsAny<int>()))
            .ReturnsAsync("Dados Stub");
        // Act
        var resultado = await mockDadosService.Object.ObterDadosAsync(123);
        // Assert
        Assert.Equal("Dados Stub", resultado);
    }
}

Pontos importantes:

Mock com Verificação de Chamadas

Para verificar comportamentos (como quantas vezes um método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. foi chamado), usamos a funcionalidade de mock🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro.:

[Fact]
public async Task Deve_Verificar_Se_Metodo_Foi_Chamado()
{
    // Arrange
    var mockDadosService = new Mock<IDadosService>();
    mockDadosService
        .Setup(service => service.ObterDadosAsync(It.IsAny<int>()))
        .ReturnsAsync("Retorno Qualquer");
    // Act
    await mockDadosService.Object.ObterDadosAsync(10);
    await mockDadosService.Object.ObterDadosAsync(20);
    // Assert
    mockDadosService.Verify(
        service => service.ObterDadosAsync(It.IsAny<int>()),
        Times.Exactly(2)
    );
}

Criando Stubs e Mocks com NSubstitute🔗

O NSubstitute se diferencia pela sintaxe mais “natural”, aproximando-se do que seria uma chamada real de código.

Stub de Retorno Assíncrono

Para criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. um stub com NSubstitute:

using NSubstitute;
using System.Threading.Tasks;
using Xunit;
public class DadosServiceNSubstituteTests
{
    [Fact]
    public async Task Deve_Retornar_Dados_Fixos_Com_Stub_NSubstitute()
    {
        // Arrange
        var stubService = Substitute.For<IDadosService>();
        stubService.ObterDadosAsync(Arg.Any<int>())
                   .Returns("Retorno Stub NSubstitute");
        // Act
        var resultado = await stubService.ObterDadosAsync(123);
        // Assert
        Assert.Equal("Retorno Stub NSubstitute", resultado);
    }
}

Observe que a configuraçãoGerenciando Secrets e Configs em Docker SwarmGerenciando Secrets e Configs em Docker SwarmAprenda a proteger credenciais, chaves e tokens com Docker Swarm. Gerencie Secrets e Configs de forma segura, garantindo integridade dos dados críticos. é feita diretamente após a chamada do método sendo “substituído”:

  • stubService.ObterDadosAsync(Arg.Any<int>()).Returns(...)

Mock com Verificação de Chamadas

Com o NSubstitute, para validar se o método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. foi chamado, utilizamos o .Received(...) ou o .DidNotReceive(...).

[Fact]
public async Task Deve_Verificar_Chamada_Com_NSubstitute()
{
    // Arrange
    var mockService = Substitute.For<IDadosService>();
    mockService.ObterDadosAsync(Arg.Any<int>())
               .Returns("Retorno Mocado");
    // Act
    await mockService.ObterDadosAsync(50);
    // Assert
    mockService.Received(1).ObterDadosAsync(Arg.Is<int>(x => x == 50));
}

Recomendações para Testar Métodos Assíncronos🔗

Conclusão🔗

Criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. mocks🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. stubs para métodos assíncronosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance. é fundamental para garantir que seu código seja confiável e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. previsível durante a execução de testes de unidade🧪 Testes de Unidade para Tratamento de Erros: Previna Falhas Futuras!🧪 Testes de Unidade para Tratamento de Erros: Previna Falhas Futuras!Descubra como implementar testes de unidade focados em tratamento de erros, evitando surpresas em produção e garantindo sistemas confiáveis e robustos.. Tanto o Moq🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. quanto o NSubstitute oferecem ferramentas simples para configurar retornos assíncronos e verificar comportamentos. Com essas técnicas, você isola as dependências externas🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. e reconhece rapidamente se seu sistema está se comportando conforme o esperado - tudo sem precisar de chamadas reais a serviços ou recursos externos.

Use este conhecimento para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais!:

Agora que você domina a criação de stubs e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. mocks🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. assíncronos, pode aplicar essas técnicas nos seus projetos🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! e escrever testes mais robustos e confiáveis.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados