失敗すると予想される 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 例外であるかどうかをコードで明示的にチェックしたくありません。これは設計が悪いためです (テストはコード用に作成する必要があり、コードはテスト用に作成するべきではありません)。しかし、通常の運用環境で発生する可能性のあるものは何でもキャッチしたいので、例外がキャッチしたい特定のタイプであることも確認できません。
私の前に誰かがこの問題を抱えていたに違いありません!解決策を見つけるのを手伝ってください。