Logo: Relish

  1. Sign up
  2. Sign in

Project: RSpec Mocks 3.0

RSpec Mocks 3.0

rspec-mocks helps to control the context in a code example by letting you set
known return values, fake implementations of methods, and even expectations
that specific messages are received by an object.

You can do these three things on test doubles that rspec-mocks creates for you
on the fly, or you can do them on objects that are part of your system.

Messages and Methods

Message and method are metaphors that we use somewhat interchangeably, but
they are subtly different. In Object Oriented Programming, objects communicate
by sending messages to one another. When an object receives a message, it
invokes a method with the same name as the message.

Test Doubles

A test double is an object that stands in for another object in your system
during a code example. Use the double method, passing in an optional identifier, to create one:

book = double("book")

Most of the time you will want some confidence that your doubles resemble an
existing object in your system. Verifying doubles are provided for this
purpose. If the existing object is available, they will prevent you from adding
stubs and expectations for methods that do not exist or that have an invalid
number of parameters.

book = instance_double("Book", :pages => 250)

Verifying doubles have some clever tricks to enable you to both test in
isolation without your dependencies loaded while still being able to validate
them against real objects.

Method Stubs

A method stub is an instruction to an object (real or test double) to return a
known value in response to a message:

allow(die).to receive(:roll) { 3 }

This tells the die object to return the value 3 when it receives the roll
message.

Message Expectations

A message expectation is an expectation that an object should receive a
specific message during the course of a code example:

describe Account do
  context "when closed" do
    it "logs an 'account closed' message" do
      logger = double()
      account = Account.new
      account.logger = logger

      expect(logger).to receive(:account_closed).with(account)

      account.close
    end
  end
end

This example specifies that the account object sends the logger the
account_closed message (with itself as an argument) when it receives the
close message.

Issues

The documentation for rspec-mocks is a work in progress. We'll be adding
Cucumber features over time, and clarifying existing ones. If you have
specific features you'd like to see added, find the existing documentation
incomplete or confusing, or, better yet, wish to write a missing Cucumber
feature yourself, please submit an
issue
or a pull
request
.

Topics

  1. Scope
  2. Changelog
  3. Method stubs
  4. Message expectations
  5. Argument matchers
  6. Mutating constants
  7. Verifying doubles
  8. Outside rspec
  9. Spies
  10. Test frameworks

Last published about 1 month ago by myronmarston.