调用原始实现

使用 and_call_original 使部分替身响应与平时一样。当您希望预期一条消息而不干扰其响应方式时,这很有用。您也可以使用它来配置大多数参数的默认响应,然后使用 with 覆盖特定参数的默认响应。

注意:and_call_original 仅支持部分替身,因为普通测试替身没有原始实现。

背景

假设有一个名为“lib/calculator.rb”的文件,其中包含

class Calculator
  def self.add(x, y)
    x + y
  end
end

and_call_original 使部分替身响应与平时一样

假设有一个名为“spec/andcalloriginal_spec.rb”的文件,其中包含

require 'calculator'

RSpec.describe "and_call_original" do
  it "responds as it normally would" do
    expect(Calculator).to receive(:add).and_call_original
    expect(Calculator.add(2, 3)).to eq(5)
  end
end

我运行 rspec spec/and_call_original_spec.rb

那么这些示例应该全部通过。

and_call_original 可以配置一个默认响应,该响应可以被特定参数的响应覆盖

假设有一个名为“spec/andcalloriginal_spec.rb”的文件,其中包含

require 'calculator'

RSpec.describe "and_call_original" do
  it "can be overridden for specific arguments using #with" do
    allow(Calculator).to receive(:add).and_call_original
    allow(Calculator).to receive(:add).with(2, 3).and_return(-5)

    expect(Calculator.add(2, 2)).to eq(4)
    expect(Calculator.add(2, 3)).to eq(-5)
  end
end

我运行 rspec spec/and_call_original_spec.rb

那么这些示例应该全部通过。