Como utilizar async/await no C# para código assíncrono
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!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!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!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íncronos
Como 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:
- A diferença entre stubs e
📊 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!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 métodos assíncronos
Como 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..
- Como criar um stub e verificar retornos em cenários
📊 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. assíncronos (com Moq e NSubstitute).
- Como validar comportamentos esperados (com Moq e NSubstitute) quando um método assíncrono
Como 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. é chamado.
Conceitos Rápidos: Stubs e Mocks🔗
- Stub: Objeto que fornece respostas pré-determinadas a chamadas, não verificando se o código foi efetivamente chamado de maneira correta. É útil quando
📊 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. você apenas precisa de um “falso” para retornar o que você precisa em um teste.
- Mock
🎭 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.: Objeto que, além de servir como stub, também verifica se métodos foram chamados de forma esperada (quantidade
🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. de vezes, parâmetros corretos etc.).
Quando falamos de métodos assíncronosComo 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
Task
, 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.
Task
ou similares. A bibliotecaDiferenç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>
🎮 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!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!)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ística | Moq | NSubstitute |
---|---|---|
Sintaxe de configuração (Setup) | Usa o método .Setup(...) para especificar comportamento e retorno | Usa 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 corretamente | Usa .Received(...) para validar as chamadas |
Operações assíncronas | Permite o uso de métodos .ReturnsAsync(...) e verificações de await | Permite .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é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!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!)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!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!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!)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!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!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:
.Setup(service => service
indica que, para qualquer valor🚀 Kubernetes: Orquestração de Microservices na Nuvem!Descubra como Kubernetes revoluciona o gerenciamento de microsserviços na nuvem, garantindo escalabilidade, automação e alta disponibilidade..ObterDadosAsync(It.IsAny<int>()))
🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. de
id
, nossa função🧠 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. deve retornar a string
📝 Strings em C#: Manipule Textos como um Mestre dos Caracteres!Aprenda a dominar os segredos das strings em C# com técnicas de manipulação, concatenação, interpolação e boas práticas, impulsionando sua performance.
"Dados Stub"
..ReturnsAsync(...)
é utilizado especificamente para métodos assíncronosComo 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. que retornam
Task
.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>
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!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!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)
);
}
.Verify(...)
confirma que o método🧠 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.
ObterDadosAsync
foi chamado exatamente duas vezes, independentemente dos parâmetros🎯 Sobrecarga de Métodos: Um Nome, Múltiplos Superpoderes!Aprenda sobre a técnica de sobrecarga de métodos no C# com exemplos e práticas recomendadas para melhorar a organização e legibilidade do seu código. passados.
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!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 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!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));
}
mockService.Received(1)
indica que esperamos que o método🧠 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. seja chamado exatamente uma vez com
id = 50
.
Recomendações para Testar Métodos Assíncronos🔗
- Esperar o Método
🧠 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.: Sempre use
await
ao chamar o método⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais.
🧠 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. que deseja testar, para garantir que as execuções assíncronas sejam concluídas antes de verificar o resultado.
- Configurações
Gerenciando 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. de Timeout: Em cenários reais, considere adicionar
📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. timeouts
Timeout e Retries: Estratégias de Resiliência com Async/AwaitAprenda a usar Timeout e Retries com async/await em C# para garantir operações assíncronas robustas e melhorar a resiliência da sua aplicação. para
🔄 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! evitar testes que ficam presos caso algo não ocorra.
- Focar na Responsabilidade do Teste: Se seu teste é para validar o fluxo de dados
gRPC e Async/Await: Desvendando APIs de Alta Performance em .NETAprenda como integrar gRPC com Async/Await no .NET para desenvolver APIs de alta performance, escaláveis e com comunicação eficiente. dentro do método, volte-se para as configurações de stub (retorno pré-definido). Se seu teste é para
🔄 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! garantir que determinado comportamento ocorra (por exemplo, número de chamadas), utilize mocks
🎭 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. com verificação
Como Assegurar Validação e Cobertura de Código em Projetos LINQAprenda estratégias avançadas para testar consultas LINQ, garantindo cobertura de código e confiabilidade com ferramentas e práticas recomendadas..
Conclusão🔗
Criar📡 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!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!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íncronos
Como 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!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!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!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!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.
- Garantir maior clareza no debug de comportamentos assíncronos.
- Reduzir o acoplamento do seu sistema a recursos
📡 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. externos.
- Manter um ambiente de testes rápido e
📊 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. reprodutível, fundamental em projetos
🌐 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! de grande porte.
Agora que você domina a criação de stubs e📊 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!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!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🔗
- Documentação oficial do .NET sobre programação assíncrona, essencial para entender o comportamento de métodos assíncronos, que é a base para a criação de mocks e stubs mostrados neste tutorial: learn.microsoft.com/pt-br/dotnet/csharp/programming-guide/concepts/async