Capybaraで複数のセッションを使う

2014-08-02T00:00:00+00:00 rspec Ruby Rails

前回の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では無くなる

ってな感じでテストする事が出来るっぽい。このやり方が正しいかどうかは微妙だけど

ActiveRecord Optimistic Locking rails generateでFactoryGirl Fixtures