Rails
Capybara
Authlogic

Authlogicが関わるテストをCapybaraで行っている時に、各テストをまたいでログイン状態が継続される場合があるので対応する

More than 3 years have passed since last update.


  • rails 4.2.5.2

  • authlogic 3.4.6

  • rspec 3.4.0

  • capybara 2.6.2

  • poltergeist 1.9.0

  • phantomjs 2.0.0

下記はCapybaraを用いたFeature specでのことです。

Controller specではAuthlogic::TestCaseが提供するメソッドで軽量にログインが行えます。

なおspec/supports以下のhelperなどはspec/rails_helper.rbで明示的に読み込ませることで有効になります。


spec/rails_helper.rb

Dir[Rails.root.join('spec/supports/**/*.rb')].each(&method(:require))



直接Cookieを編集してログイン状態としている

テストにおいてログイン状態が必要な場合、Web APIなどを介してログインを行うなどしていると積み重なって結構な時間になります。

そのような理由から、テストの際にはCookieを直接編集してログイン状態を作りだします。


spec/rails_helper.rb

require "authlogic/test_case"

include Authlogic::TestCase


supports/authlogic_helper.rb

def authlogic_login(user)

activate_authlogic
UserSession.create!(user)
credential = [user.persistence_token, user.id].join('::')

begin
cookies['user_credentials'] = credential
rescue
page.driver.set_cookie('user_credentials', credential)
end
end


このCookieが次のテストでも継続する場合があります。


ぬかりなくCookieを消す

ログアウトは、ログインと同じくCookieを直接編集することで行えます。

ログインするテストではログアウトを書く、というのでは忘れるので、after :eachで毎回行われるようにします。

同じくhelperを書きます。

ただしcookiespage.driverがない状況でもとにかく毎回終了時に呼ばれるので、これが原因でテストが落ちないようにします。


supports/authlogic_helper.rb

def authlogic_logout

begin
cookies['user_credentials'] = ''
rescue
page.driver.set_cookie('user_credentials', '') rescue nil
end
end

乱暴ですね。

spec/rails_helper.rbのコンフィグを利用して、どのテストでも毎回クリアされるようにします。


spec/rails_helper.rb

RSpec.configure do |config|

...
config.after :each do
authlogic_logout
end
end


なお大阪では海遊館でカピバラに会えます

行こう海遊館(前回書きそこねた)

IMAG0129.jpg