Por que um teste que toca a rede é um teste em que não dá para confiar
Uma chamada HTTP de saída, já neste app
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.
def self.call(partner:, http: Net::HTTP)
new(partner, http).call
end
Rode isso num teste do jeito que está e o teste faz uma requisição pela internet para a URL que o registro do parceiro tiver. O teste passa a ser tão confiável quanto a disponibilidade desse site, o tempo de resposta dele e a conexão de rede desta máquina, três coisas das quais um teste de unidade não devia depender. Este app tem mais uma chamada de saída, o Partners::WebhookTransport, que envia payloads de webhook para parceiros; a aula 5 mostra como os testes dele também evitam a rede.
O que dá errado, na prática
Uma suíte com uma única chamada de rede herda todos os jeitos como uma chamada de rede pode falhar sem relação nenhuma com o código testado. O site pode estar fora do ar. Pode ficar lento a ponto de estourar o FetchSiteIconService::TIMEOUT, que é de 5 segundos no arquivo. Pode mudar o HTML e mover a tag <link> do ícone. Ou o CI pode não ter rota nenhuma para a internet pública. Nenhuma dessas falhas diz algo sobre o código deste app estar certo; elas só deixam a suíte instável, lenta ou as duas coisas.
A ideia em torno da qual este curso é construído
Troque a chamada de rede de verdade por uma falsa que devolve o que o teste precisa, sem nenhum byte passando por um fio. Duas gems Ruby muito usadas fazem isso: WebMock e VCR. Nenhuma das duas está instalada neste app; não há linha webmock nem vcr no Gemfile ou no Gemfile.lock. Este curso ensina as duas, a partir da documentação delas, e mostra onde o código deste app já resolve o mesmo problema de outro jeito, sem nenhuma das gems.
O que este curso cobre
Sete aulas, apoiadas no código deste app. Esta aula apresenta o Partners::FetchSiteIconService, o serviço de HTTP de saída que o curso acompanha. A aula 2 trata da sintaxe stub_request/to_return do WebMock e da rede de segurança disable_net_connect!, a partir do README dele. A aula 3 trata do modelo de gravação em cassetes do VCR e de como ele difere do WebMock, a partir do README e do código-fonte dele. A aula 4 percorre a lógica de busca, redirect e content type do FetchSiteIconService. A aula 5 mostra como o spec deste app para esse serviço finge a rede hoje, sem nenhuma das gems instalada. A aula 6 trata da troca de token do OAuth do GitHub, outro lugar onde há tráfego de rede, e da lacuna em como ela é testada. A aula 7 fecha com um desafio pequeno e autocontido: um registro de stubs em miniatura, em Ruby puro.
Continue com a aula 2
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.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.