mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 15:18:01 +00:00
45 lines
1.1 KiB
Markdown
45 lines
1.1 KiB
Markdown
# 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:
|
|
|
|
```ruby
|
|
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).
|
|
|
|
```ruby
|
|
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](https://relishapp.com/rspec/rspec-mocks/v/2-14/docs/message-expectations/calling-the-original-method)
|