Capybara+RSpecでCookieの設定と読み込みをサクっと書こう・・と思って、数日ハマっていて
- 公式サイト
- capybara、rspec、cookie、page、browser、というキーワードに引っかかりそうな英語のページ
- Qiitaのcapybaraタグの情報
を見ても一向に解決策が見つからず途方にくれていたのですが、何が原因でハマったのかわかったので自分用にメモ
環境
- Mac OS X 10.8.5
- Ruby 2.2.0
- rbenv利用してインストールしてます
- rails 4.2.0
- rspec 3.1.0
Capybaraのことを実はよくわかってなかった
ついさっき見たCapybaraを使う際に知っておきたいこと。これが突破口になりました。
3種類のDriverがあるっていうことを全く意識しておらず、ググって見つかった情報は、CapybaraのどのDriverを利用したケースのものだったのかを認識してませんでした(^_^;)
そのため、binding.pryで、Cookieの値を確認しようと思って
[1] pry(#<RSpec::Core::Example>)> page.driver.browser.cookies
NoMethodError: undefined method `cookies' for #<Capybara::RackTest::Browser:0x007fc4e7623a78>
from (pry):2:in `block in run'
みたいなことをしても原因わからない時は何故なのかちっとも理解できませんでした
上記エラーメッセージをじっくり見てどのDriver利用してるかわかった。
エラーメッセージでNoMethodError: undefined method `cookies' for Capybara::RackTest::Browser:0x007fc4e7623a78みたいな感じで表示されてますが自分はデフォルトのCapybara::RackTestを使ってることがわかりました。
一方で、binding.pryした時にやったpage.driver.browser.cookiesみたいなやつは、capybara-webkitを使ってる場合の書き方でした。
RSPecでCookieの設定と読み込みの書き方
Cookieの読み込み方法は英語のページですがこちらを参考にしました。(設定で参考にしたページを忘れてしまいました。。。)
ひとまず設定&読み込みのサンプルを簡単に以下に示しておきます
spec/spec_helper
# 途中省略
include Capybara::DSL
spec/factories/restaurants.rb
FactoryGirl.define do
factory :restaurant do
sequence(:tabelog_url) { |n| "restaurant_tabelog_url#{n}" }
sequence(:name) { |n| "restaurant_name#{n}" }
end
end
spec/controllers/restaurants_controller_spec.rb
describe RestaurantsController do
let(:restaurant) { create :restaurant }
describe 'visit restaurants' do
it 'クッキーを確認できる' do
visit '/restaurants/1'
page.driver.browser.set_cookie("user=user1;expires=#{(Time.now+86400).strftime("%a, %d %b %Y %H:%M:%S GMT")}; ")
cookie_value = page.driver.browser.rack_mock_session.cookie_jar['user']
expect(cookie_value).to eq 'user1'
end
end
end
教訓
利用する技術の概念を正確に掴まないうちに適当にググるのは良くないですね