Logo: Relish

  1. Sign in

Project: Bogus 0.1.6

Safe mocking

In Bogus you normally use the following pattern to make sure right messages were sent between the tested object and it's collaborators:

  1. Stub the collaborator method in let or before
  2. In one test ensure that the tested method returns the right thing
  3. In another test use have_received to ensure that the method on collaborator was called with right arguments.

However, there are cases when the more general stub in let or before is not enough. Then, we can use mocking to reduce the amount of code written.

The syntax for mocking is:

mock(object).method_name(*args) { return_value }

You can only mock methods that actually exist on an object. It will also work with methods that the object responds_to?, but (obviously) without being able to check the method signature.

Background
Given
a file named "library.rb" with:
class Library
  def checkout(book)
  end
end
Scenarios
Mocking methods that exist on real object
Then
spec file with following content should pass:
require_relative 'library'

describe Library do
  it "does something" do
    library = Library.new
    mock(library).checkout("some book") { :checked_out }

    expect(library.checkout("some book")).to eq(:checked_out)
  end
end
Mocking methods that do not exist on real object
Then
spec file with following content should fail:
require_relative 'library'

describe Library do
  it "does something" do
    library = Library.new
    mock(library).buy("some book") { :bought }
    library.buy("some book")
  end
end
Mocking methods with wrong number of arguments
Then
spec file with following content should fail:
require_relative 'library'

describe Library do
  it "does something" do
    library = Library.new
    mock(library).checkout("some book", "another book") { :bought }
    library.checkout("some book", "another book")
  end
end
Mocks require the methods to be called
Then
spec file with following content should fail:
require_relative 'library'

describe Library do
  it "does something" do
    library = Library.new
    mock(library).checkout("some book") { :bought }
  end
end

Last published about 3 years ago by Adam Pohorecki.