Ruby 如何使用Rspec mock存根给定类的任何实例

Ruby 如何使用Rspec mock存根给定类的任何实例,ruby,mocking,rspec,Ruby,Mocking,Rspec,以下代码引发错误:未定义String:Class的“any_instance”方法 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 如何将Mocks模块包括到

以下代码引发错误:
未定义String:Class的“any_instance”方法

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

如何将Mocks模块包括到类或对象类中?

对于2.6.0之前版本的RSpec mock,您不能这样做。但是,您可以在Mocha(如图所示)或Rspec的更高版本中使用
任何_实例

在您的
spec/spec\u helper.rb

确保您有这一行:

config.mock_随附:摩卡


未注释

任何_实例最近都添加到了rspec中,因此您的示例现在对我来说就像rspec2.7一样有效

rspec 3的更新: 新的方法是

允许(String.)的任何实例接收(:foo.)并返回(1)


这里有更多的实例文档:

好吧,考虑到问题是“使用Rspec mock”,我不确定“不要使用Rspec mock”的答案是否有用。再说一遍,这比技术上正确的答案要好:你做不到。上面的测试实际上是来自Rspec本身的测试。模块AnyInstance是通过(mocks.rb)被包含的:
Class.Class_eval{include RSpec::mocks::AnyInstance}
我认为有一种方法可以做到这一点。这就是当前的主程序,但尚未发布。在未来一两周内,它将成为rspec-mocks-2.6.0发行版的一部分。我在2.7.1中,但有一个与rspec-mocks 3.0文档类似的问题: