2011-10-25 14 views
4

まず第一に、外部APIコールを嘲笑することがほとんどの場合に妥当であることに同意します。しかし、この場合ではありません。タイムアウト::エラーが発生した場合、rspecの例を自動的に再実行

いくつかのテストでランダムにTimeout::Error例外が発生しています。これらのテストを無視して、自動的にサンプルを再実行したいと考えています。失敗は、失敗した10回の試みの後でのみ報告されるべきです。

その他の例外&のエラーが報告されます。

私はspec/spec_helper.rbファイルにグローバルaround(:each)フックを使用して、この動作を実装しようとしました:

RSpec.configure do |config| 
    config.around(:each) do |example| 
    attempts = 0 
    passed = false 

    begin 
     attempts +=1 
     example.run 
     passed = true 

    rescue Timeout::Error => e 
     raise e if attempts >= 10 

    end until passed 
    end 
end 

ただし例外が発生したときに救助一部が実行されることは決してありません。どんな考え?

ありがとうございます! ドリアン

P.S.私はrspec 2.6.0を使用しています

答えて

7

aroundブロックの例外を救済することはできません。あなたは絶対に必見再実行例を失敗した場合しかし、あなたはここのように、@exampleのうち、現在の例外をてこすることができます:それはかなり厄介に見える

https://github.com/jnicklas/capybara/blob/c21d5eb2375b610ac13f54cf240e59c80918a2f1/spec/spec_helper.rb#L16

。私たちの言い訳は、私たちの上流の図書館のバグでしたが、可能であれば一般的にこれを避けるでしょう。

1

ログの例外にアクセスする方法として、@ Joの答えを使用しました。

私たちがRSpecを2.99にアップグレードするまでは(3.0への移行の観点から)、それは素晴らしいものでした。インスタンス変数@exceptionは、周囲フックのオブジェクトに存在しないようです。

フックのから前と後のフックに切り替えて、前と同じように例外にアクセスする必要がありました。

config.after(:each) do |example| 
    exception = example.instance_variable_get('@exception') 
    # .... 
end 

私は再試行を試みていませんでしたが、私はRSpec 3.0でどのように達成するのかは分かりません。

関連する問題