2015年11月現在、Rails のプロダクトでユーザ認証機能(いわゆるログイン、ログアウト)を作るとしたらデファクトスタンダードとなっている Devise という Gem ですが、
歴史の長いフレームワークなだけあって、ちょっと記述が古い点があります。例えば
rails g devise:controller hoge
で追加される controller が before_action ではなく before_filter を使っていたり。
まぁそこらへんは適時 Rubocop あたりに修正してもらうとして、とはいえデフォルトの設定のまま使うこともないので、記述の古さや遷移先等を修正したり、Userモデルにカラムを追加したりしたら、テストを書きたくなるわけです。
というわけでとりあえず、
rails3-devise-rspec-cucumber
の記述を参考にしつつ、可能な限りモダンな RSpec, Cucumber を書いていったわけなのですが、問題が。
実際に手で動かしたら再現しない、テストの失敗がでました。
構成
- Ruby : 2.2.3(rbenv でインストールされる最新)
- Rails : 4.2.4
- devise : 3.5.2
- cucumber : 1.3.20
- poltergeist : 1.8.0
Rails.root/support/env.rb に Capybara.default_driver = :poltergeist と記入し、全ての Cucumber の受け入れテストに poltergeist の driver を使う設定としました。
また、 Devise ではメール認証を行うため、「confirmable」のコメントアウトを外し、有効にする設定にしました。
エラーの箇所
sign_in.feature の最初のテスト、9行目「Then I see an invalid login message」が失敗しました。本来なら user_steps.rb の 109行目に記述のある「Email is invalid」に類する、カラムの値がおかしい旨のメッセージが表示されたいのですが、実際には、
You have to confirm your email address before continuing.
という、「ユーザ登録は行っているが、メール認証は行っていない」ときのエラーがでました。
ちなみに、 rack_test だと、このエラーは出ませんし、もちろん、手動で動かした場合は、「Email is invalid」が表示されます。
試行錯誤
user_steps では「一度ユーザを作って削除している」という動作を行っているため、その前後でsession, cookie を削除する処理を入れましたが、それでもどうしようもなく。
解決策
devise の github の wiki に、解決策が載っていました。
How To: Test with Capybara#Capybara and Poltergeist
Cucumber の問題だと思って見逃してしまっていました。
指定されたファイルを Rails.root/features/support/ 下に置けば、とりあえず動きました。
とりあえず、動いたのでOK。
オチ
ちなみにこのファイルが入った状態で Rubocop で構文チェックを行ったところ、怒られました。クラス変数をインスタンス変数に変更しても動いたので、よし。
そして動いたのはいいけれど、JavaScript を使っていないテストは、時間短縮のため rack_test で行うことに。
ちなみに(これは未解決)
capybara-webkit でも出たので、phantomJS との相性なのかなぁ、と思っています。