プログラミング学習 備忘録

Railsを学習していく上での技術メモ。学んだことや解決したエラーなどを記録していきます。

【RSpec】システムスペックを実装してみた②

今回もRSpecのシステムスペックについてです。前回は新規でコードを実装しましたが、今回は既存のコードの修正を行いました。 その過程で学んだことについて記します。



FactoryBotのtraitについて

FactoryBotの以下のコードを使って、taskの編集に関するテストで使用するtaskオブジェクトを定義する場合

FactoryBot.define do
  factory :task do
    association :project
    title { 'Task' }
    status { rand(2) }
    from = Date.parse("2019/08/01")
    to   = Date.parse("2019/12/31")
    deadline { Random.rand(from..to) }
task = FactoryBot.create(:task, project_id: project.id, status: :done, completion_date: Time.current.yesterday)

このようになりだいぶ冗長になってしまう。 そのため、FactoryBotのtrait機能を使ってDRYにする。

FactoryBot.define do
  factory :task do
    association :project
    title { 'Task' }
    status { rand(2) }
    from = Date.parse("2019/08/01")
    to   = Date.parse("2019/12/31")
    deadline { Random.rand(from..to) }

    trait :done do
      status { :done }
      completion_date { Time.current.yesterday }
    end
  end
end
task = FactoryBot.create(:task, :done, project_id: project.id)

このように、引数に:doneと渡してやるだけで実装できる。


別タブに移動した後の動作をテストする場合

windows = page.driver.browser.window_handles
page.driver.browser.switch_to.window(windows.last)

このように書くことで、別タブをスコープにテストを実行できる。
なお、この場合カレントタブは変わらずそのままである。

カレントタブも移動する場合は

switch_to_window(windows.last)

で移動できる。


テストの中でアラートメッセージを押す

削除機能テストなどで、confirmウィンドウを操作したいときは

#承認するとき
page.driver.browser.switch_to.alert.accept

#拒否するとき
page.driver.browser.switch_to.alert.dismiss

で実装できる。