Rspec类any_instance需要method_name - 它在哪里被记录?

时间:2015-04-09 11:52:05

标签: ruby rspec mocking

我在Rspec测试中偶然发现了以下一段代码,我必须说我或多或少知道它的作用,但我无法找到相关的来源来证明它。请指出我描述的宝石或文档:

describe SomeModule::Salesforce::Lead do
  before do
    SomeModule::Salesforce::Lead.any_instance.expects(:materialize)
  end
...
end

似乎对于:此规范中的每个示例,它都会在上述类的任何实例上设置期望以接收对:materialize方法的调用 AND 它实际上重新定义 什么都不做的方法。最后一部分看起来很重要,因为它避免了在测试环境中连接到SalesForce,但我无法找到确认。

2 个答案:

答案 0 :(得分:1)

any_instance记录在Working with Legacy code

你是正确的,它既设置了期望,又在任何给定的类实例上存根原始方法。

以前版本的RSpec通过monkeypatch实现这一目标的ruby核心类(ObjectBaseObject

RSpec 3有一种新的语法,它不依赖于monkeypatching:

before do
  expect_any_instance_of(SomeModule::Salesforce).to receive(:materialize)
end

答案 1 :(得分:0)

好的我刚刚发现我查找的是错误的来源,它不是来自RSpec,而是来自Mocha Mock(期望和any_instance)http://gofreerange.com/mocha/docs/Mocha/Mock.html#expects-instance_method 谢谢@ tomasz-pajor @ https://stackoverflow.com/users/2928259/tomasz-pajor