【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
で実装できる。