Edited at

フィーチャスペックでテスト失敗時に自動的に save_and_open_page を実行する方法

More than 3 years have passed since last update.


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 する前には削除しておく方が良いでしょう。


参考文献


あわせて読みたい