save_and_open_page を使うときに困る事と実現したい事
save_and_open_page はRSpecのフィーチャスペックの実行中に、その時点の画面の状態をブラウザで確認できるメソッドです。
click_on 'Create User'
# ブラウザで画面を開く
save_and_open_page
expect(page).to have_content 'ユーザを作成しました'
実際のブラウザの状態を目で確認できるので大変便利なのですが、 save_and_open_page
を毎回付けたり消したりする必要があります。
フィーチャスペックはその性質上、ある程度の長いテストになります。
そのため、ポイントAで発生した問題を解決したら、今度はポイントBで問題が発生した、なんていうことが時々発生します。
その場合は再度 save_and_open_page
を挟み込まなければいけません。
scenario '長いテスト' do
# ...
save_and_open_page
expect(page).to have_content 'ほげほげ'
# ...
save_and_open_page # ここにも追加?
expect(page).to have_content 'ふがふが'
# ...
save_and_open_page # ここにも追加?
expect(page).to have_content 'ぴよぴよ'
end
さらに、テストが失敗する、しないに関わらず save_and_open_page
を呼ぶとブラウザが起動します。
テストが失敗するときはブラウザが起動すると助かりますが、何も問題が発生していないポイントでブラウザが起動すると逆に迷惑です。
そこで、 「テストが失敗したときにだけ自動的に save_and_open_page
を呼んでブラウザを起動する」 という仕組みを入れてみましょう。
セットアップと使い方
spec/rails_helper.rb
に次の設定を追加します。
RSpec.configure do |config|
# 他の設定...
config.after do |example|
if example.metadata[:type] == :feature and example.exception.present? and example.metadata[:open_on_error] == true
save_and_open_page
end
end
end
自動的に save_and_open_page
を呼び出したいテストに open_on_error: true
タグを付けます。
scenario '長いテスト', open_on_error: true do
# ...
expect(page).to have_content 'ほげほげ'
# ...
expect(page).to have_content 'ふがふが'
# ...
expect(page).to have_content 'ぴよぴよ'
end
こうするとテストが失敗したときにだけ save_and_open_page
が呼ばれて、テスト失敗時点の画面を確認できます。
テストがパスしたときは何も起きません。
補足
-
open_on_error
というのは僕が勝手に名付けたタグ名なので、好きなタグ名に変えて構いません。 -
save_and_open_page
を付けたり消したりする必要はありませんが、open_on_error: true
を付けたり消したりする手間は発生します。 -
open_on_error: true
はあくまでデバッグ用のタグなので、git push
する前には削除しておく方が良いでしょう。