私のテストには、外部サービスで動作するコードがいくつかあります。このサービスはあまり安定していないため、理由もなくクラッシュすることがあります。しかし、実行の 80% ではうまく機能します。
したがって、失敗したすべての rspec を数回 (たとえば 2 回または 3 回) 自動的に再実行するメソッドが必要です。それを行う方法はありますか?
多くの人は、あなたのテストは実際には外部サービスに影響を与えるべきではないと言うでしょう。それがそうする理由の 1 つです。一部の外部サービスがダウンしているためにテストが失敗することはありません。
TL;DR はモックとスタブを使用するか、これらの外部サービス呼び出しを置き換えます
失敗した仕様を再実行する代わりに、サービスにアクセスするメソッドを設定された回数だけ実行し、結果の論理ORで期待値を実行することはできませんか?
したがって、代わりに:
it "returns expected value for some args" do
unstable_external_service(<some args>).should == <expected return value>
end
次のようなことをしてください。
def run_x_times(times, args)
return nil if times == 0
unstable_external_service(args) || run_x_times(times-1)
end
it "returns expected value for some args" do
run_x_times(10, <some args>).should == <expected return value>
end
サービスにアクセスするときはいつでも、テスト全体で同じラッパーメソッドを使用できます。ここでは、サービスが失敗したときに戻ると想定していますnil
が、そうでない場合は、特定のケースに合わせてこれを変更できます。一般的な考え方がわかります。