/ / rspec-mocksの元のメソッドに戻る - ruby​​、rspec、mocking、stub

rspec-mocksの元のメソッドに戻る - ruby​​、rspec、mocking、stub

RSpec :: Mocksに一連の値のメソッドをスタブするように指示することは可能ですか? そうでなければ元のメソッドにフォールバック?例えば:

File.stub(:exist?).with(/txt/).and_return(true)
File.exist? "log.txt"    # returns true
File.exist? "dev.log"    # <<< need to fallback to original File.exist? here

上の例の現在の最後の呼び出しは、 MockExpectationErrorデフォルト値を提供するように要求します。元のメソッドにフォールバックするようにrspec-mocksに指示することは可能ですか?

回答:

回答№1は5

元のメソッドをキャッシュして明示的に呼び出すことができます。

original_method = File.method(:exist?)
File.stub(:exist?).with(anything()) { |*args| original_method.call(*args) }
File.stub(:exist?).with(/txt/).and_return(true)

しかし、これは面倒です。もっと良い答えを見たいと思っています。

完全を期すために、上記のコードを一般化します。

def stub_with_fallback(obj, method)
original_method = obj.method(method)
obj.stub(method).with(anything()) { |*args| original_method.call(*args) }
return obj.stub(method)
end

# usage example:
stub_with_fallback(File, :exist?).with(/txt/).and_return(true)