1

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に元のメソッドにフォールバックするように指示することは可能ですか?

4

1 に答える 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)
于 2012-09-21T18:55:54.483 に答える