2012-09-21 34 views
1

是否可以告訴RSpec :: Mocks爲一組值存根方法,否則回退到原始方法?例如:在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回退到原始方法?

+0

這與rspec的,模擬的問題https://github.com/rspec/rspec-mocks/issues/23 –

回答

4

一旦可以緩存原來的方法,並明確調用它:

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)