今回はインテグレーションテストにはCucumberを使わずRequestSpecを使ってみよーぜーということになった。Deviseでのユーザーをログインさせる方法を考えていたのだが、普通にログイン画面を開いてメアドとパスワードを打たせてログインしてから、さてさて…とやるのは時間がかかるだろうから、いい方法を調べよう!ということになったので、メモ。
参考にしたサイトは以下の通り。
- Devise認証なコントローラーをRSpecでテストする : さかなチキンぱん。
- rspec & devise test helpers
- Integration tests with Devise and RSpec
spec_helpers.rbに
RSpec.configure do |config| # Devise config.include Devise::TestHelpers, :type => :controller config.extend ControllerMacros, :type => :controller end
と書けば、というのはあくまでもコントローラーのテストの場合で、RequestSpecではうまくいかなかった。:type => :requestにしてもうまくいかなかった。その後、Warden::Test::Helpersをincludeしてやりなさいという記事を見つけたので、RequestSpec側のファイルで行ったところ、うまくいった。しかし、毎回全部のRequestSpecファイルに書くのは面倒だなーと思って模索していたのだが、ようやくそれっぽい解に辿り着いた。
まず、spec/supportフォルダ以下に、request_helpers.rbを作成し、そこにRequestHelpersモジュールを定義する。
# coding: utf-8 # spec/support/request_helpers.rb include Warden::Test::Helpers module RequestHelpers def create_logged_in_user user = FactoryGirl.build :user, :role => FactoryGirl.create(:role) # Cancan使ってるから権限もある user.confirm! user.save! login(user) user end def login(user) login_as user, scope: :user, :run_callbacks => false end end
その後、spec_helpers.rbに以下を定義する。
RSpec.configure do |config| # Devise config.include Devise::TestHelpers, :type => :controller config.extend ControllerMacros, :type => :controller config.include RequestHelpers, :type => :request end
これで、適当なspec/requestsフォルダ以下のテストで、以下のようbeforeでcreate_logged_in_userメソッドを使えば、毎回ログイン処理をおこなってくれる。
# coding: utf-8 require 'spec_helper' describe "Hoges" do before do create_logged_in_user end describe "GET /hoges" do it "works! (now write some real specs)" do get hoges_path response.status.should be(200) end end end
これでようやくテストをする下地ができたかなぁ〜という感じ。