Capybaraで複数のセッションを使う
前回のActiveRecord Optimistic Lockingのような同一のページのインスタンスを持つセッションが複数あり、一方のセッションで処理した後で他のセッションで処理するとエラーになるっていう振る舞いをテストするにはどうしたら良いのかっていう件
という事でやってみた
とりあえずOptimistic Lockなエラーはデフォルトだと409 Conflictになる模様?なので、エラーが起きたら500エラーにする方向で処理を修正しておく(正常な場合はredirect_toされるので302)
require "rails_helper"
describe EntriesController do
fixtures :entry
it "test" do
session1 = create_session
session1.visit("/entry/edit?id=1")
session2 = create_session
session2.visit("/entry/edit?id=1")
session1.fill_in "Name", :with => "A"
session1.click_button "update"
expect(session1.status_code).to be(302)
session2.fill_in "Name", :with => "B"
session2.click_button "update"
expect(session2.status_code).to be(302)
end
end
def create_session
session = Capybara::Session.new(:rack_test, Sample::Application)
session.driver.options[:follow_redirects] = false
session
end
っていう感じで一つのテストでCapybara::Sessionを複数生成して処理をテストする的な感じかと。でこれを実行すると
F
Failures:
1) EntriesController test
Failure/Error: expect(session2.status_code).to be(302)
expected # => 302
got # => 500
Compared using equal?, which compares object identity,
but expected and actual are not the same object. Use
`expect(actual).to eq(expected)` if you don"t care about
object identity in this example.
っていうように最初のセッションでclick_buttonでアップデートされた後に既に開いる別のセッションにてclick_buttonでアップデート処理しようとするとエラーになり返ってくるステータスコードは302では無くなる
ってな感じでテストする事が出来るっぽい。このやり方が正しいかどうかは微妙だけど