Module: Mocha::ObjectMethods

Included in:
Object
Defined in:
lib/mocha/object.rb,
lib/mocha/inspect.rb,
lib/mocha/metaclass.rb,
lib/mocha/parameter_matchers/object.rb

Overview

Methods added all objects to allow mocking and stubbing on real objects.

Methods return a Mocha::Expectation which can be further modified by methods on Mocha::Expectation.

Instance Method Summary collapse

Instance Method Details

#__metaclass__Object



4
5
6
# File 'lib/mocha/metaclass.rb', line 4

def __metaclass__
  class << self; self; end
end

#expects(method_name_or_hash) ⇒ Object

:call-seq: expects(method_name) -> expectation

expects(method_names_vs_return_values) -> last expectation

Adds an expectation that a method identified by method_name Symbol must be called exactly once with any parameters. Returns the new expectation which can be further modified by methods on Mocha::Expectation.

product = Product.new
product.expects(:save).returns(true)
assert_equal true, product.save

The original implementation of Product#save is replaced temporarily.

The original implementation of Product#save is restored at the end of the test.

If method_names_vs_return_values is a Hash, an expectation will be set up for each entry using the key as method_name and value as return_value.

product = Product.new
product.expects(:valid? => true, :save => true)

# exactly equivalent to

product = Product.new
product.expects(:valid?).returns(true)
product.expects(:save).returns(true)


53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/mocha/object.rb', line 53

def expects(method_name_or_hash)
  expectation = nil
  mockery = Mocha::Mockery.instance
  iterator = ArgumentIterator.new(method_name_or_hash)
  iterator.each { |*args|
    method_name = args.shift
    mockery.on_stubbing(self, method_name)
    method = stubba_method.new(stubba_object, method_name)
    mockery.stubba.stub(method)
    expectation = mocha.expects(method_name, caller)
    expectation.returns(args.shift) if args.length > 0
  }
  expectation
end

#method_exists?(method, include_public_methods = true) ⇒ Boolean

:nodoc:

Returns:

  • (Boolean)


105
106
107
108
109
110
111
112
113
# File 'lib/mocha/object.rb', line 105

def method_exists?(method, include_public_methods = true) # :nodoc:
  if include_public_methods
    return true if public_methods(include_superclass_methods = true).include?(method)
    return true if respond_to?(method.to_sym)
  end
  return true if protected_methods(include_superclass_methods = true).include?(method)
  return true if private_methods(include_superclass_methods = true).include?(method)
  return false
end

#mochaObject

:nodoc:



15
16
17
# File 'lib/mocha/object.rb', line 15

def mocha # :nodoc:
  @mocha ||= Mocha::Mockery.instance.mock_impersonating(self)
end

#mocha_inspectObject



6
7
8
9
10
# File 'lib/mocha/inspect.rb', line 6

def mocha_inspect
  address = self.__id__ * 2
  address += 0x100000000 if address < 0
  inspect =~ /#</ ? "#<#{self.class}:0x#{'%x' % address}>" : inspect
end

#reset_mochaObject

:nodoc:



19
20
21
# File 'lib/mocha/object.rb', line 19

def reset_mocha # :nodoc:
  @mocha = nil
end

#stubba_methodObject

:nodoc:



23
24
25
# File 'lib/mocha/object.rb', line 23

def stubba_method # :nodoc:
  Mocha::InstanceMethod
end

#stubba_objectObject

:nodoc:



27
28
29
# File 'lib/mocha/object.rb', line 27

def stubba_object # :nodoc:
  self
end

#stubs(method_name_or_hash) ⇒ Object

:call-seq: stubs(method_name) -> expectation

stubs(method_names_vs_return_values) -> last expectation

Adds an expectation that a method identified by method_name Symbol may be called any number of times with any parameters. Returns the new expectation which can be further modified by methods on Mocha::Expectation.

product = Product.new
product.stubs(:save).returns(true)
assert_equal true, product.save

The original implementation of Product#save is replaced temporarily.

The original implementation of Product#save is restored at the end of the test.

If method_names_vs_return_values is a Hash, an expectation will be set up for each entry using the key as method_name and value as return_value.

product = Product.new
product.stubs(:valid? => true, :save => true)

# exactly equivalent to

product = Product.new
product.stubs(:valid?).returns(true)
product.stubs(:save).returns(true)


90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/mocha/object.rb', line 90

def stubs(method_name_or_hash)
  expectation = nil
  mockery = Mocha::Mockery.instance
  iterator = ArgumentIterator.new(method_name_or_hash)
  iterator.each { |*args|
    method_name = args.shift
    mockery.on_stubbing(self, method_name)
    method = stubba_method.new(stubba_object, method_name)
    mockery.stubba.stub(method)
    expectation = mocha.stubs(method_name, caller)
    expectation.returns(args.shift) if args.length > 0
  }
  expectation
end

#to_matcherObject

:nodoc:



6
7
8
# File 'lib/mocha/parameter_matchers/object.rb', line 6

def to_matcher # :nodoc:
  Mocha::ParameterMatchers::Equals.new(self)
end