用 rspec-mock 替换实例方法

Replace instance method with rspec-mock

The RSpec documentation 展示了如何模拟 class 方法。我该如何替换实例方法。下面是一个代码示例,使用 rspec-mocks 使其更具体:

require 'rspec'

class Foo
  def foo
    "foo"
  end

  def foobar
    foo + "bar"
  end
end

RSpec.describe "Foo" do
  it "mocks foo" do
    allow(Foo).to receive(:foo).and_return("bar")
    foo = Foo.new
    expect(foo.foobar).to eq("barbar")
  end
end

这给出了“Foo 没有实现:foo”。当然,这是为了简化而设计的。在我正在测试的实际 class 中,foo 发出 HTTP 请求,因此我想在为 foobar 编写规范时模拟它。我想用 rspec-mocks 来做这件事,但如果另一个 gem 可以提供帮助,我也愿意接受。

只需将方法存入实例而不是 class:

RSpec.describe "Foo" do
  it "mocks foo" do
    foo = Foo.new
    allow(foo).to receive(:foo).and_return("bar")
    expect(foo.foobar).to eq("barbar")
  end
end