Calling the original implementation

Use and_call_original to make a partial double response as it normally would. This can be useful when you want to expect a message without interfering with how it responds. You can also use it to configure the default response for most arguments, and then override that for specific arguments using with.

Note: and_call_original is only supported on partial doubles, as normal test doubles do not have an original implementation.

Background

Given a file named “lib/calculator.rb” with:

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

and_call_original makes the partial double respond as it normally would

Given a file named “spec/andcalloriginal_spec.rb” with:

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

When I run rspec spec/and_call_original_spec.rb

Then the examples should all pass.

and_call_original can configure a default response that can be overridden for specific args

Given a file named “spec/andcalloriginal_spec.rb” with:

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

When I run rspec spec/and_call_original_spec.rb

Then the examples should all pass.