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_driver
em 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