存根由包装器方法(RSpec Mocks)调用的'嵌套'类方法

时间:2017-08-22 23:46:58

标签: rspec rspec-mocks

情况:我想存根一个帮助器方法,这样我就可以调用一个包装它的方法并获取存根响应。

代码设置如下:

class Thing
  def self.method_one(foo)
    self.method_two(foo, 'some random string')
  end

  def self.method_two(foo, bar)
    self.method_three(foo, bar, 'no meaning')
  end

  def self.method_three(foo, bar, baz)
    "#{foo} is #{bar} with #{baz}"
  end
end

我正在尝试模仿.method_three,以便我可以致电.method_one并让它最终调用.method_three的双倍而不是真正的交易:

it "uses the mock for .method_three" do
  response_double = 'This is a different string'
  thing = class_double("Thing", :method_three => response_double).as_stubbed_const

  response = thing.method_one('Hi')
  expect(response).to eq(response_double)
end

我得到的错误:

RSpec::Mocks::MockExpectationError: #<ClassDouble(Thing) (anonymous)> received unexpected message :method_one with ("Hi")

我正在尝试做什么?感觉就像我错过了一个明显的步骤,但尽管我尽了最大的努力,但我还是找不到这样的例子,或者问一个可以比较的问题。

(注意:如果重要,这不是Rails项目。)

1 个答案:

答案 0 :(得分:1)

您可能希望使用RSpec的allow(...)来存根中间方法。这对于测试逻辑流程或在测试中模拟第三方服务也很有用。

例如: expected_response = 'This is a different string' allow(Thing).to receive(:method_three).and_return(expected_response)

然后expect(Thing.method_one('Hi')).to eq(expected_response)应该通过。

有关存根方法的更多信息,请参阅https://relishapp.com/rspec/rspec-mocks/v/2-14/docs/method-stubs