DEV Community

Arthur Valentim Kasper
Arthur Valentim Kasper

Posted on

Com testar APIs externas com Webmock e VCR no RSpec

Bora falar como podemos testar API externas a nossa aplicação em nossas aplicações utilizando Webmock e VCR, para este artigo estarei usando a suite de teste RSpec. Vou tentar ser bem minimalista e direto nas explicações*.*

💎 Os exemplos serão feitos em um app Rails

🌐 Webmock

O webmock é uma gem que nos permite criar stubs de chamadas HTTP, ou seja, ela permite criar retornos falsos para algum serviço de internet, mas sem fazer a chamada real.

Configurando

Adicionar no Gemfile

group :test do
  gem "webmock"
end
Enter fullscreen mode Exit fullscreen mode

Dentro do seu arquivo spec/spec_helper adicionar o seguinte require

require 'webmock/rspec'
Enter fullscreen mode Exit fullscreen mode

Rodar bundle install para instalar a gem

bundle install
Enter fullscreen mode Exit fullscreen mode

Com isso as sua chamadas HTTP já ficam desabilitadas e o Webmock exigira que você realiza o stub dos retornos, mas fazer esses mocks/retornos para toda nova API que vamos testar pode ser tornar chato e cansativo, nesta parte que entra o VCR, que vai fazer isso “automagicamente” para nós, bora ver como isso pode ser feito.

📼 VCR

A gem VCR grava as iterações de suas chamadas para que o resultado dessas chamadas sejam utilizados no futuro, em outras palavras ela cria o stub para nós, realizando a chamada real uma única vez, após isso utiliza esse resultado para os testes.

Configurando

Adicionar no Gemfile

group :test do
  gem "vcr"
end
Enter fullscreen mode Exit fullscreen mode

Adicionar esse trecho de código dentro de spec_helpers:

VCR.configure do |config|
  config.cassette_library_dir = "spec/fixtures/cassettes"
  config.hook_into :webmock
  config.configure_rspec_metadata!
end
Enter fullscreen mode Exit fullscreen mode

A propriedade cassette_library_dir se refere ao local onde os retornos das APIs serão armazenados, já a hook_into nos diz que o webmock (que vimos no tópico anterior) é usado para desabilitar as chamadas http quando necessário e o configure_rspec_metadata! possibilita adicionar uma propriedade em nossos testes rspec para deixa-los menos verbosos ao usar o VCR, quando formos para o código isso ficará mais claro.

👨‍💻Testando

Para testar vou realizar uma simples chamada get para a API do JSON Placeholder em meu teste.

describe 'ServiceApi' do
  it 'get a post', :vcr do
    response = Net::HTTP.get('jsonplaceholder.typicode.com', '/posts/1')
    expect(response.code).to eq '200'
end
Enter fullscreen mode Exit fullscreen mode

Perceba que no meu it, eu adicionei o argumento :vcr, basicamente com isso eu já informo para o RSpec que o teste usará o VCR, caso vc tenha multiplos teste, é possível adicionar o argumento diretamente no describe de seu teste.

Ao rodar o teste, temos a seguinte situação

1 example, 0 failures
Enter fullscreen mode Exit fullscreen mode

Ele passou como esperado, peceba que foi gerado um arquivo no diretório que configuramos na propriedade cassette_library_dir do VCR com o nome do teste, isso demontra que o VCR fez a chamada e armazenou o conteúdo num arquivo yml, agora as próximas vezes que esse mesmo teste for executado, o RSpec vai consultar este arquivo (que pode ser chamado de cassete) e não realizará uma chamada real, caso você precise regerar o arquivo, basta excluílo e rodar o teste novamente.

Bacana né? Essa é uma forma bem simples de trabalharmos com APIs externas em nossos testes e garantirmos que não teremos falhas intermitentes.

Top comments (2)

Collapse
 
eltonzierhut profile image
EltonZierhut •

Muito legal!!! Me ajudou bastante!

Collapse
 
arthurvkasper profile image
Arthur Valentim Kasper •

Show de bola Elton, valeu demais!