私の Rails プロジェクトでは、VCRと RSpec を使用して、1 秒に 1 回しか呼び出しを許可しない外部 REST Web サービスに対する HTTP 相互作用をテストしています。
これが意味することは、Web サービスからの「呼び出し回数の超過」エラーが原因で失敗するまで、テスト スイートを実行することになるということです。ただし、その段階では、少なくともいくつかのカセットが録音されるため、最終的にすべてのカセットが録音され、スイートがカセットのみを使用して実行できるようになるまで、テスト スイートを継続的に実行します (my default_cassette_options = { record: :new_episodes }
)。これは最適な方法ではないように思えます。特に、将来頻繁にカセットを再録音する必要がある場合はなおさらです。絶え間ない呼び出しにより、Web サービスのブラックリストに登録されるのではないかと心配しています (テストはありません)。私が知っている彼らが持っているサーバー)。
sleep(1)
そのため、Web サービスへの呼び出しが行われる直前にRspecブロックに呼び出しを入れてみることにit
なり、それらの呼び出しを VCR 構成にリファクタリングしました。
仕様/サポート/vcr.rb
VCR.configure do |c|
# ...
c.after_http_request do |request, response|
sleep(1)
end
end
これはうまくいくように見えますが、これを行うためのより良い方法はありますか? 現時点では、まだカセットを持たない外部サービスへの呼び出しがスイートの最終テストである場合、スイートは不必要に 1 秒間スリープします。同様に、テスト スイートでカセットを使用しない 2 つの Web サービス呼び出しの間の時間が 1 秒を超える場合、別の不要な一時停止が発生します。これらの種類の条件をテストするためのロジックを作成した人はいますか、または VCR 構成でこれをエレガントに行う方法はありますか?