should_receive

should_receive is the old way to expect messages but carries the baggage of a global monkey patch on all objects. It supports the same fluent interface for setting constraints and configuring responses.

Similarly, you can use should_not_receive to set a negative message expectation.

Background

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

RSpec.configure do |config|
  config.mock_with :rspec do |mocks|
    mocks.syntax = :should
  end
end

And a file named “.rspec” with:

--require spec_helper

Failing positive message expectation

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

RSpec.describe "An unfulfilled message expectation" do
  it "triggers a failure" do
    dbl = double("Some Collaborator")
    dbl.should_receive(:foo)
  end
end

When I run rspec spec/unfulfilled_message_expectation_spec.rb

Then it should fail with:

  1) An unfulfilled message expectation triggers a failure
     Failure/Error: dbl.should_receive(:foo)

       (Double "Some Collaborator").foo(*(any args))
           expected: 1 time with any arguments
           received: 0 times with any arguments

Passing positive message expectation

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

RSpec.describe "A fulfilled message expectation" do
  it "passes" do
    dbl = double("Some Collaborator")
    dbl.should_receive(:foo)
    dbl.foo
  end
end

When I run rspec spec/fulfilled_message_expectation_spec.rb

Then the examples should all pass.

Failing negative message expectation

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

RSpec.describe "A negative message expectation" do
  it "fails when the message is received" do
    dbl = double("Some Collaborator").as_null_object
    dbl.should_not_receive(:foo)
    dbl.foo
  end
end

When I run rspec spec/negative_message_expectation_spec.rb

Then it should fail with:

  1) A negative message expectation fails when the message is received
     Failure/Error: dbl.foo

       (Double "Some Collaborator").foo(no args)
           expected: 0 times with any arguments
           received: 1 time

Passing negative message expectation

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

RSpec.describe "A negative message expectation" do
  it "passes if the message is never received" do
    dbl = double("Some Collaborator").as_null_object
    dbl.should_not_receive(:foo)
  end
end

When I run rspec spec/negative_message_expectation_spec.rb

Then the examples should all pass.