Teste de integração com rspec e devise

Então, estamos construindo um aplicativo Rails e queríamos usar rspec para fazer alguns testes de integração (fazer alguns testes nas solicitações). Criamos nossos testes na pasta spec / requests / assim:

# encoding: UTF-8
require
'spec_helper'

describe
"Links:" do
it
"should have the title 'Links'" do
visit
"/links/"
page
.should have_selector('h1', text: 'Links')
end
end

Funcionou muito bem!

$> bundle exec rspec spec/requests/links_spec.rb --order random
...
Finished in 0.2016 seconds
1 example, 0 failures

Então adicionamos o devise e ele parou de funcionar. O site agora requer que você faça login para visitar essa página. Os testes rspec não estão fazendo isso, então estão redirecionando para a página de login, onde não encontrará o título H1 que esperamos.

Olhamos pela internet e encontramos dois posts ( [1] e [2] ) que nos colocaram no caminho certo, mas não resolveram completamente nosso problema, então tivemos que misturá-los! Foi assim que fizemos:

Primeiro, vamos configurar o FactoryGirl para simular um usuário. Criamos uma fábrica em spec / factories / user.rb:
ruby FactoryGirl.define do factory :user do email "test@test2.com" password "testtest" password_confirmation "testtest" end end

Agora temos que adicionar um auxiliar para realmente conectar o usuário. Seguindo [2] , fizemos isso em spec / support / devise support.rb, mas o método `post via_redirect` para login não funcionou para nós, tínhamos para usar o método descrito em [1] :

# Module for authenticating users for request specs.
module ValidUserRequestHelper
# Signs in a valid user uwing the page.drive.post method
def sign_in_as_valid_user_driver
@user ||= FactoryGirl.create :user
page
.driver.post user_session_path, :user => {:email => @user.email, :password => @user.password}
end
end

Temos que configurar spec / spec_helper.rb para usar este helper.

RSpec.configure do |config|
[...]
config
.include ValidUserRequestHelper, :type => :request
end

Agora podemos usar o método sign_in_as_valid_user_driverem nossas especificações:

# encoding: UTF-8
require
'spec_helper'

describe
"Links:" do
it
"should have the title 'Links'" do
sign_in_as_valid_user_driver

visit
"/links/"
page
.should have_selector('h1', text: 'Links')
end
end

Claro que haverá vários testes, por isso não devemos repetir a chamada em cada um:

# encoding: UTF-8
require
'spec_helper'

describe
"Links:" do

before
do
sign_in_as_valid_user_driver

end

it
"should have the title 'Links'" do
visit
"/links/"
page
.should have_selector('h1', text: 'Links')
end
end