Expect A Method To Be Called And Actually Call It

You can assert that a method is called without actually executing it. This is often what expect(...).to receive(:method_name) is used for. If you do want that method called, RSpec can accommodate you.

Let's say we have the following two classes:

class Greeting
  def self.say_hello
    raise "Don't actually execute this"
    puts "Hello"
  end
end

class GreetingService
  def self.run
    Greeting.say_hello
  end
end

We can assert that say_hello gets called without actually raising the exception (first it block). If we tack on and_call_original then RSpec will make the assertion and execute the method (second it block).

describe "expect and call original" do
  it "expect the message is received" do
    expect(Greeting).to receive(:say_hello)
    GreetingService.run
    # passes
  end

  it "expect and call original" do
    expect(Greeting).to receive(:say_hello).and_call_original
    GreetingService.run
    # fails, RuntimeError
  end
end

source

Last updated