RSpec: Qual é a diferença entre um recurso e uma especificação de solicitação?

113

Qual é a diferença conceitual entre as especificações de recursos do Rspec e as especificações de solicitação ?

Dos documentos de especificações de recursos:

As especificações de recursos são testes de alto nível destinados a exercitar fatias de funcionalidade por meio de um aplicativo. Eles devem conduzir o aplicativo apenas por meio de sua interface externa, geralmente páginas da web.

E para especificações de solicitação:

As especificações de solicitação fornecem um wrapper fino em torno dos testes de integração do Rails e são projetadas para conduzir o comportamento por meio da pilha completa, incluindo roteamento (fornecido pelo Rails) e sem stubbing (você decide). Com as especificações de solicitação, você pode:

  • especificar um único pedido
  • especificar vários pedidos em vários controladores
  • especificar vários pedidos em várias sessões

Eu sei que as especificações de recursos usam Capybara e as especificações de solicitação não. Mas isso dificilmente merece conceitos diferentes.

prejuízo
fonte

Respostas:

147

A diferença conceitual é que você normalmente está testando uma história de usuário e toda interação deve ser conduzida por meio da interface do usuário. É aí que entra o Capybara. Uma especificação de solicitação ainda está testando o comportamento de seu aplicativo e não tem a expectativa de legibilidade que um teste de aceitação teria. Portanto, o recurso existe para a sintaxe aprimorada para testes de aceitação.

As diferenças técnicas incluem especificações de solicitação envolvendo testes de integração Rails, enquanto as especificações de recursos não. Isso significa que, com as especificações de solicitação, você pode usar os métodos get, post, put, delete e assert contra a resposta. Com as especificações de recursos, você deve conduzir toda a interação por meio do navegador e usar métodos como visitar e afirmar na página.

Eu recomendo a leitura de feature_spec.feature no código-fonte rspec-rails no github. Eu espero que isso ajude.

Richard Jordan
fonte
2
Portanto, você recomendaria o uso de especificações de recurso e solicitação ou uma ou outra é suficiente? (Sendo novo no TDD ...)
robertwbradford
2
Eu uso os dois, @robertwbradford. Eu uso especificações de recursos para conduzir meus testes externos - testando a experiência do usuário e, em seguida, desenvolvendo a funcionalidade usando testes de unidade. Eu uso de pedido de especificações para testar respostas - por exemplo, em um sessions_spec eu possa ter uma descrevem "GET /login"bloco com expectativas em itblocos, como expect(response.status).to eq(200)e expect(response).to render_template(:new), ou em um describe "POST /sessions", um context "with valid credentials"bloco, com expect(response).to redirect_to(user)efollow_redirect!; expect(response.body).to include("Signed in")
Richard Jordan
5
E você usa as especificações do controlador também? Parece que há um pouco de duplicação entre o que você testa nas especificações de solicitação e o que normalmente é testado nas especificações do controlador.
Ernesto
5
Dizendo isso, o post vinculado acima descreve claramente as diferenças. Use especificações de solicitação para testar via API, use especificações de recurso para testar via front-end.
Damien Roche
2
@RichardJordan: Uma pergunta: Nas especificações de recursos, você recomendaria usar caminhos Rails (ou seja visit users_path) ou strings codificadas ( visit '/users') ?. Pessoalmente, prefiro não usar nenhuma parte interna do aplicativo nesse tipo de especificação.
tokland