Testes: WebMock e VCR
O curso trata de como evitar que testes façam chamadas HTTP ao vivo, usando um serviço de saída deste app como exemplo. Ele explica por que chamadas de rede deixam a suíte instável e lenta. Apresenta o stub_request, o to_return e o disable_net_connect! do WebMock, além dos cassetes e modos de gravação do VCR. Lê o Partners::FetchSiteIconService e o helper fake_http que o spec dele passa pelo argumento nomeado http:. Mostra também como o modo de teste do OmniAuth pula a troca de token do GitHub e fecha com um desafio de registro de stubs em Ruby puro.
O que você vai aprender
- ✓Por que chamadas de rede ao vivo tornam os testes pouco confiáveis
- ✓Stub de requisições com stub_request, with e to_return do WebMock
- ✓Fazer requisições sem stub falharem com disable_net_connect!
- ✓Gravar e repetir HTTP com cassetes e modos de gravação do VCR
- ✓Simular o Net::HTTP por uma costura de injeção de dependência
- ✓Como o modo de teste do OmniAuth substitui a troca de token do GitHub nos specs
Por que um teste que toca a rede é um teste em que não dá para confiar
O app/services/partners/fetch_site_icon_service.rb, que está no ar neste app hoje, faz algo que nenhum dos cursos de testes anteriores tocou. Ele abre uma conexão Net::HTTP com o site de um parceiro, baixa o HTML, procura um link de ícone e baixa esse ícone também.
Ler a aula completa grátis →Currículo
7 aulasPor que um teste que toca a rede é um teste em que não dá para confiar
Por que uma chamada de rede ao vivo deixa a suíte instável, com o serviço de ícones deste app como exemplo.
O que o WebMock faz: stub_request, to_return, e disable_net_connect!
A sintaxe stub_request, with e to_return do WebMock, a rede de segurança disable_net_connect! e os matchers do RSpec.
O que o VCR faz de diferente: grava uma vez, repete de um cassete
Como o VCR grava uma requisição real uma vez num cassete, a repete depois e oferece quatro modos de gravação.
Lendo o serviço de ícones deste app de ponta a ponta
Leitura do FetchSiteIconService: prioridade de ícones, a costura de injeção http:, redirects e checagens de content type e tamanho.
Como o spec deste app finge a rede hoje, sem nenhuma das gems
Como o spec deste app simula o Net::HTTP com um helper fake_http feito à mão, e a falta de um disable_net_connect!.
OAuth: chamadas de rede que este app não faz sozinho, e como os testes as pulam
Como a troca de token do OAuth do GitHub roda no middleware da gem e como o modo de teste do OmniAuth a pula.
Juntando tudo: duas gems, e as alternativas deste app
Uma revisão do WebMock, do VCR e das alternativas deste app, fechando com um desafio de registro de stubs em Ruby puro.