サバンナでの不安定なテスト対策の一部まとめ
wait_for_image_laoding
を定義して画像のロード待ちでコケていそうなところに適宜使ってきたけど、逐一必要なところを探すのがだるい
module WaitBeforeClick
def _wait_for_image_loading
Timeout.timeout(Capybara.default_max_wait_time) do
sleep 0.5 until evaluate_script(<<~JS)
Array.prototype.every.call(
document.querySelectorAll('img'),
(e) => e.complete
)
JS
end
rescue Timeout::Error
Rails.logger.debug 'timeout _wait_for_image_loading'
end
def click(*keys, **options)
_wait_for_image_loading
super
end
end
module Capybara
module Node
class Element < Base
prepend WaitBeforeClick
end
end
end
class Api::BaseController < ApplicationController
before_action :keep_flash
def keep_flash
flash.keep
end
end
テスト中に一回ログアウトしてなにかする、というときにflashメッセージが正しく表示されない問題があった
「ログアウトしました」というflashメッセージを出したい
が、ログアウト処理〜トップページの表示の間にAPIが実行される
APIはログイン前提なので「ログインしてください」というflashメッセージが設定される
トップページには「ログインしてください」と表示される
という流れだった。未ログインでAPIを実行したときはflashメッセージを追加せずに403を返すようにして対応した