4

まず第一に、外部API呼び出しをモックすることがほとんどの場合正しいことであることに同意します。ただし、この場合はそうではありません。

一部のテストでランダムなTimeout::Error例外が発生しているので、それらを無視して、例を自動的に再実行できるようにしたいと思います。失敗は、10回失敗した後にのみ報告する必要があります。

その他の例外と障害はすべて報告する必要があります。

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

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

ただし、例外が発生したときにレスキュー部分が実行されることはありません。なぜですか?

ありがとう!ドリアン

PS私はrspec2.6.0を使用しています

4

2 に答える 2

7

around例外は伝播しないため、ブロック内の例外をレスキューすることはできません。ただし、失敗した例をどうしても再実行する必要@exampleがある場合は、次のように、現在の例外を削除できます。

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

それはかなり厄介に見えます。私たちの言い訳は私たちのアップストリームライブラリのバグでしたが、私は通常、可能な限りこれを避けます。

于 2012-02-03T00:37:05.013 に答える
1

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

RSpecを2.99にアップグレードするまで(3.0への移行を視野に入れて)、それは私たちにとって素晴らしい働きをしました。インスタンス変数@exceptionは、アラウンドフックのサンプルオブジェクトに存在しなくなったようです。

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

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

再試行は試みていませんが、RSpec3.0でどのように再試行するかはわかりません。

于 2014-06-17T13:03:13.983 に答える