Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Railsの技: Capybaraのテストで複数のセッションを扱う(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Railsの技: Capybaraのテストで複数のセッションを扱う(翻訳)

アプリケーション内の機能は、複数のユーザーにまたがって動作することもあります。自動化システムテストを書くときにCapybaraのusing_sessionヘルパーを使うと、複数ユーザーの間の行き来を簡単にシミュレートできます。

ユーザーごとにログインやログアウトを繰り返したり、アプリに対して別のユーザーが変更を加えているように見せかけなくても、同一のCapybaraテスト内で複数のセッションを利用できます。

using_sessionヘルパーは通知機能やチャット機能などのテストにも便利ですし、ワークフローでタスクを進めるために複数のユーザーが操作を行わなければならない場合のテストにも有用です。

利用法

Capybaraでセッションを制御する方法はいくつかあります。

以下のようにセッションを手動で設定することも一応可能です。

Capybara.session_name = "Test session #1"

しかし私はusing_sessionヘルパーにブロックを渡す方法が好みです。これによってブロック内のコードを独立したセッション内で実行し、ブロックが終了すると元のセッションに復帰します。

以下は、基本的なタスク管理システムのテストの例です。ユーザーはこのシステムで、完了すべきタスクを別のユーザーに割り当てることができます。

describe "Task Assignment", type: :system do

  it "allows users to assign tasks to other users" do
    login as: users(:kelly)

    visit "/tasks"

    click_on "Review deliverable"

    click_button "Assign to..."

    select "Sam", from: "Assignee"
    click_button "Save"

    expect(page).to have_content("Status: Pending")
    expect(page).to have_content("Assigned: Sam")

    using_session("Sam") do
      login as: users(:sam)

      visit "/tasks/me"
      expect(page).to have_content("Review deliverable")

      click_on "Review deliverable"
      click_on "Mark complete"
    end

    refresh

    expect(page).to have_content("Status: Completed")
  end
end

参考資料

関連記事

Railsの技: Active Recordオブジェクトはチェイン可能にして返そう(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。