4

失敗すると予想される rspec テストがありますが、テスト中のコードが rspec が発生させた例外をレスキューするため、合格しています。状況の例を次に示します。

class Thing do

  def self.method_being_tested( object )
    # ... do some stuff

    begin
      object.save!
    rescue Exception => e
      # Swallow the exception and log it
    end
  end

end

rspec ファイルで:

describe "method_being_tested" do
  it "should not call 'save!' on the object passed in" do
    # ... set up the test conditions

    mock_object.should_not_receive( :save! )
    Thing.method_being_tested( mock_object )
  end
end

実行が「object.save!」に到達していることはわかっていました。したがって、テストは失敗するはずですが、テストは成功します。レスキュー ブロックでデバッガーを使用すると、次のことがわかります。

(rdb:1) p e # print the exception object "e"
#<RSpec::Mocks::MockExpectationError: (Mock "TestObject_1001").save!
    expected: 0 times
    received: 1 time>

したがって、基本的にテストは失敗しますが、テストしようとしているコード自体によって失敗が抑制されています。このコードが Rspec 例外を飲み込むのを止める実行可能な方法が、何らかの形でコードを危険にさらすことなしにわかりません。例外が Rspec 例外であるかどうかをコードで明示的にチェックしたくありません。これは設計が悪いためです (テストはコード用に作成する必要があり、コードはテスト用に作成するべきではありません)。しかし、通常の運用環境で発生する可能性のあるものは何でもキャッチしたいので、例外がキャッチしたい特定のタイプであることも確認できません。

私の前に誰かがこの問題を抱えていたに違いありません!解決策を見つけるのを手伝ってください。

4

3 に答える 3

1

rspec-mock から:

module RSpec
  module Mocks
    class MockExpectationError < Exception
    end

    class AmbiguousReturnError < StandardError
    end
  end
end

あなたは本当にキャッチする必要がありますExceptionか?StandardError代わりに捕まえてくれませんか?

すべての例外をキャッチすることは、一般的に悪いことです。

于 2011-09-16T02:45:54.030 に答える