Module: RSpec::Mocks::Methods

Included in:
TestDouble
Defined in:
lib/rspec/mocks/methods.rb

Overview

Methods that are added to every object.

Instance Method Summary collapse

Instance Method Details

#as_null_objectObject

Tells the object to respond to all messages. If specific stub values are declared, they'll work as expected. If not, the receiver is returned.



99
100
101
102
# File 'lib/rspec/mocks/methods.rb', line 99

def as_null_object
  @_null_object = true
  __mock_proxy.as_null_object
end

#null_object?Boolean

Returns true if this object has received as_null_object

Returns:

  • (Boolean)


105
106
107
# File 'lib/rspec/mocks/methods.rb', line 105

def null_object?
  defined?(@_null_object)
end

#should_not_receive(message, &block) ⇒ Object

Sets and expectation that this object should not receive a message during this example.



20
21
22
# File 'lib/rspec/mocks/methods.rb', line 20

def should_not_receive(message, &block)
  __mock_proxy.add_negative_message_expectation(caller(1)[0], message.to_sym, &block)
end

#should_receive(message, opts = {}, &block) ⇒ Object

Sets and expectation that this object should receive a message before the end of the example.

Examples:


logger = double('logger')
thing_that_logs = ThingThatLogs.new(logger)
logger.should_receive(:log)
thing_that_logs.do_something_that_logs_a_message


14
15
16
# File 'lib/rspec/mocks/methods.rb', line 14

def should_receive(message, opts={}, &block)
  __mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], message.to_sym, opts, &block)
end

#stub(message_or_hash, opts = {}, &block) ⇒ Object Also known as: stub!

Tells the object to respond to the message with the specified value.

Examples:


counter.stub(:count).and_return(37)
counter.stub(:count => 37)
counter.stub(:count) { 37 }


31
32
33
34
35
36
37
# File 'lib/rspec/mocks/methods.rb', line 31

def stub(message_or_hash, opts={}, &block)
  if Hash === message_or_hash
    message_or_hash.each {|message, value| stub(message).and_return value }
  else
    __mock_proxy.add_stub(caller(1)[0], message_or_hash.to_sym, opts, &block)
  end
end

#stub_chain(method1, method2) ⇒ Object #stub_chain("method1.method2") ⇒ Object #stub_chain(method1, method_to_value_hash) ⇒ Object

Stubs a chain of methods.

Warning:

Chains can be arbitrarily long, which makes it quite painless to violate the Law of Demeter in violent ways, so you should consider any use of stub_chain a code smell. Even though not all code smells indicate real problems (think fluent interfaces), stub_chain still results in brittle examples. For example, if you write foo.stub_chain(:bar, :baz => 37) in a spec and then the implementation calls foo.baz.bar, the stub will not work.

Examples:


double.stub_chain("foo.bar") { :baz }
double.stub_chain(:foo, :bar => :baz)
double.stub_chain(:foo, :bar) { :baz }

# Given any of ^^ these three forms ^^:
double.foo.bar # => :baz

# Common use in Rails/ActiveRecord:
Article.stub_chain("recent.published") { [Article.new] }


80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/rspec/mocks/methods.rb', line 80

def stub_chain(*chain, &blk)
  chain, blk = format_chain(*chain, &blk)
  if chain.length > 1
    if matching_stub = __mock_proxy.__send__(:find_matching_method_stub, chain[0].to_sym)
      chain.shift
      matching_stub.invoke.stub_chain(*chain, &blk)
    else
      next_in_chain = Object.new
      stub(chain.shift) { next_in_chain }
      next_in_chain.stub_chain(*chain, &blk)
    end
  else
    stub(chain.shift, &blk)
  end
end

#unstub(message) ⇒ Object Also known as: unstub!

Removes a stub. On a double, the object will no longer respond to message. On a real object, the original method (if it exists) is restored.

This is rarely used, but can be useful when a stub is set up during a shared before hook for the common case, but you want to replace it for a special case.



46
47
48
# File 'lib/rspec/mocks/methods.rb', line 46

def unstub(message)
  __mock_proxy.remove_stub(message)
end