2011-04-12 60 views
18

下面的代碼給定類引發錯誤:undefined method 'any_instance' for String:Class如何存根任何實例使用Rspec的嘲笑

require 'rspec' 

RSpec.configure do |config| 
    config.mock_with :rspec 
end 

describe String do 
    it 'stubs' do 
    String.any_instance.stub(:foo).and_return(1) 
    ''.foo.should eq(1) 
    end 
end 

如何可以包括嘲笑模塊插入類或對象類?

回答

3

在RSpec Mocks之前的2.6.0版本中,你不能這樣做。但是,您可以使用any_instance和Mocha(見here)或更高版本的Rspec。

在你spec/spec_helper.rb

請確保您有這行:

config.mock_with :mocha

註釋。

+4

好,因爲問題是「使用Rspec的嘲笑」,我不知道答案「不使用Rspec的嘲弄」是很有用的。再說一遍,這比技術上正確的答案要好:你做不到。 – 2011-04-12 20:24:43

+0

非常真實,更新的答案。 – 2011-04-12 20:25:59

+1

上面的測試實際上是來自Rspec本身的測試[link](https://github.com/rspec/rspec-mocks/blob/master/spec/rspec/mocks/any_instance_spec.rb#L124)。並通過(mocks.rb)包含模塊AnyInstance: 'Class.class_eval {include RSpec :: Mocks :: AnyInstance}' 我認爲有辦法以某種方式做到這一點。 – Andy 2011-04-12 21:08:43

30

any_instance最近被添加到rspec,所以你的例子現在適用於我,因爲它是rspec 2.7。

這裏比較any_instance文檔:https://www.relishapp.com/rspec/rspec-mocks/docs/method-stubs/stub-on-any-instance-of-a-class

+0

官方文檔:http://rubydoc.info/gems/rspec-mocks/RSpec/Mocks/AnyInstance – 2012-06-18 20:05:39

+0

Rspec Mocks 3.0 doc:[https://www.relishapp的.com/rspec的/ rspec的-嘲笑/文檔/工作與 - 遺留碼/任何實例](https://www.relishapp.com/rspec/rspec-mocks/docs/working-with-legacy-code/任何實例) – user650654 2014-09-03 23:04:47