czwartek, 5 stycznia 2012

Capybara i Devise - mock logowania

Piszemy request spec-i dla naszej aplikacji.

require 'spec_helper'
describe 'PostsController' do
before { visit new_post_path }
it "should display form for post creation" do
pending "we need to sign in first!!!"
end
end
view raw post_spec.rb hosted with ❤ by GitHub
No i problem! Jak zalogować użytkownika?

Możemy użyć metody "brute force" ;) i po prostu wejść na stronę logowania i wypełnić formularz

require 'spec_helper'
describe 'PostsController'
let(:user) { Factory :user }
it "should authenticate and than display form" do
visit new_session_path
fill_in 'Login', with: user.email
fill_in 'Password', with: user.password
click_button 'Sing in'
visit new_post_path
# fill in new post form
end
end
view raw post_spec.rb hosted with ❤ by GitHub
Albo zrobić to sprytniej i użyć helperów Warden-a (na którym oparte jest Devise) Utwórzmy plik /spec/support/devise.rb

RSpec.configure do |config|
config.include Warden::Test::Helpers
config.before(:all) do
Warden.test_mode!
end
config.after(:all) do
Warden.test_reset!
end
end
def sign_in(user)
login_as user
end
view raw devise.rb hosted with ❤ by GitHub
Teraz w spec-ach możemy używać metody #sign_in

require 'spec_helper'
describe 'PostsController'
let(:user) { Factory :user }
before { sign_in user }
it "should display form" do
visit new_post_path
# fill in new post form
end
end
view raw post_spec.rb hosted with ❤ by GitHub
Takie rozwiązanie potrzebne jest tylko przy request spec-ach używających driver-a capybary, który obsługuje javascript (capybara-webkit, capybara-selenium). Przy spec-ach używających Rack driver wystarczy*:

def sign_in(user)
page.driver.post user_session_path, user: { login: user.email, password: user.password }
end
view raw devise.rb hosted with ❤ by GitHub

*Wydaje mi się jednak, że wersja używająca Warden-a jest szybsza. Ale możliwe że to tylko subiektywne wrażenie

Brak komentarzy:

Prześlij komentarz