Class: RSpec::Mocks::AnyInstance::Recorder

Inherits:
Object
  • Object
show all
Defined in:
lib/rspec/mocks/any_instance/recorder.rb

Overview

Given a class TheClass, TheClass.any_instance returns a Recorder, which records stubs and message expectations for later playback on instances of TheClass.

Further constraints are stored in instances of Chain.

See Also:

  • RSpec::Mocks::AnyInstance
  • Chain

Instance Method Summary collapse

Constructor Details

#initialize(klass) ⇒ Recorder



16
17
18
19
20
21
22
23
# File 'lib/rspec/mocks/any_instance/recorder.rb', line 16

def initialize(klass)
  @message_chains = MessageChains.new
  @stubs = Hash.new { |hash, key| hash[key] = [] }
  @observed_methods = []
  @played_methods = {}
  @klass = klass
  @expectation_set = false
end

Instance Method Details

#should_not_receive(method_name, &block) ⇒ Object

The opposite of should_receive

See Also:

  • Methods#should_not_receive


69
70
71
# File 'lib/rspec/mocks/any_instance/recorder.rb', line 69

def should_not_receive(method_name, &block)
  should_receive(method_name, &block).never
end

#should_receive(method_name, &block) ⇒ Object

Initializes the recording a message expectation to be played back against any instance of this object that invokes the submitted method.

See Also:

  • Methods#should_receive


60
61
62
63
64
# File 'lib/rspec/mocks/any_instance/recorder.rb', line 60

def should_receive(method_name, &block)
  @expectation_set = true
  observe!(method_name)
  message_chains.add(method_name, PositiveExpectationChain.new(self, method_name, &block))
end

#stub(method_name, &block) ⇒ Object

Initializes the recording a stub to be played back against any instance of this object that invokes the submitted method.

See Also:

  • Methods#stub


29
30
31
32
# File 'lib/rspec/mocks/any_instance/recorder.rb', line 29

def stub(method_name, &block)
  observe!(method_name)
  message_chains.add(method_name, StubChain.new(self, method_name, &block))
end

#stub_chain(*method_names_and_optional_return_values, &block) ⇒ Object

Initializes the recording a stub chain to be played back against any instance of this object that invokes the method matching the first argument.

See Also:

  • Methods#stub_chain


39
40
41
42
43
44
# File 'lib/rspec/mocks/any_instance/recorder.rb', line 39

def stub_chain(*method_names_and_optional_return_values, &block)
  normalize_chain(*method_names_and_optional_return_values) do |method_name, args|
    observe!(method_name)
    message_chains.add(method_name, StubChainChain.new(self, *args, &block))
  end
end

#unstub(method_name) ⇒ Object

Removes any previously recorded stubs, stub_chains or message expectations that use method_name.

See Also:

  • Methods#unstub


77
78
79
80
81
82
83
84
# File 'lib/rspec/mocks/any_instance/recorder.rb', line 77

def unstub(method_name)
  unless @observed_methods.include?(method_name.to_sym)
    raise RSpec::Mocks::MockExpectationError, "The method `#{method_name}` was not stubbed or was already unstubbed"
  end
  message_chains.remove_stub_chains_for!(method_name)
  stubs[method_name].clear
  stop_observing!(method_name) unless message_chains.has_expectation?(method_name)
end

#verifyObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Used internally to verify that message expectations have been fulfilled.



90
91
92
93
94
95
96
97
# File 'lib/rspec/mocks/any_instance/recorder.rb', line 90

def verify
  return unless @expectation_set
  return if message_chains.all_expectations_fulfilled?

  raise RSpec::Mocks::MockExpectationError,
        "Exactly one instance should have received the following " \
        "message(s) but didn't: #{message_chains.unfulfilled_expectations.sort.join(', ')}"
end