1
0
mirror of https://github.com/jbranchaud/til synced 2026-01-03 07:08:01 +00:00
Files
til/ruby/expect-a-method-to-be-called-and-actually-call-it.md
2019-07-29 15:13:34 -05:00

1.1 KiB

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