Class: Mocha::ClassMethod

Inherits:
Object show all
Defined in:
lib/mocha/class_method.rb

Direct Known Subclasses

AnyInstanceMethod, InstanceMethod, ModuleMethod

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(stubbee, method) ⇒ ClassMethod

Returns a new instance of ClassMethod.



9
10
11
12
# File 'lib/mocha/class_method.rb', line 9

def initialize(stubbee, method)
  @stubbee = stubbee
  @method = RUBY_VERSION < '1.9' ? method.to_s : method.to_sym
end

Instance Attribute Details

#methodObject (readonly)

Returns the value of attribute method.



7
8
9
# File 'lib/mocha/class_method.rb', line 7

def method
  @method
end

#stubbeeObject (readonly)

Returns the value of attribute stubbee.



7
8
9
# File 'lib/mocha/class_method.rb', line 7

def stubbee
  @stubbee
end

Instance Method Details

#define_new_methodObject



46
47
48
49
50
51
52
# File 'lib/mocha/class_method.rb', line 46

def define_new_method
  stubbee.__metaclass__.class_eval(%{
    def #{method}(*args, &block)
      mocha.method_missing(:#{method}, *args, &block)
    end
  }, __FILE__, __LINE__)
end

#hidden_methodObject



69
70
71
72
73
74
75
76
77
# File 'lib/mocha/class_method.rb', line 69

def hidden_method
  if RUBY_VERSION < '1.9'
    method_name = method.to_s.gsub(/\W/) { |s| "_substituted_character_#{s[0]}_" }
  else
    method_name = method.to_s.gsub(/\W/) { |s| "_substituted_character_#{s.ord}_" }
  end
  hidden_method = "__stubba__#{method_name}__stubba__"
  RUBY_VERSION < '1.9' ? hidden_method.to_s : hidden_method.to_sym
end

#hide_original_methodObject



36
37
38
39
40
41
42
43
44
# File 'lib/mocha/class_method.rb', line 36

def hide_original_method
  if method_exists?(method)
    begin
      stubbee.__metaclass__.send(:alias_method, hidden_method, method)
    rescue NameError
      # deal with nasties like ActiveRecord::Associations::AssociationProxy
    end
  end
end

#matches?(other) ⇒ Boolean

Returns:

  • (Boolean)


79
80
81
82
# File 'lib/mocha/class_method.rb', line 79

def matches?(other)
  return false unless (other.class == self.class)
  (stubbee.object_id == other.stubbee.object_id) and (method == other.method)
end

#method_exists?(method) ⇒ Boolean

Returns:

  • (Boolean)


90
91
92
93
94
# File 'lib/mocha/class_method.rb', line 90

def method_exists?(method)
  symbol = method.to_sym
  __metaclass__ = stubbee.__metaclass__
  __metaclass__.public_method_defined?(symbol) || __metaclass__.protected_method_defined?(symbol) || __metaclass__.private_method_defined?(symbol)
end

#mockObject



28
29
30
# File 'lib/mocha/class_method.rb', line 28

def mock
  stubbee.mocha
end

#remove_new_methodObject



54
55
56
# File 'lib/mocha/class_method.rb', line 54

def remove_new_method
  stubbee.__metaclass__.send(:remove_method, method)
end

#reset_mochaObject



32
33
34
# File 'lib/mocha/class_method.rb', line 32

def reset_mocha
  stubbee.reset_mocha
end

#restore_original_methodObject



58
59
60
61
62
63
64
65
66
67
# File 'lib/mocha/class_method.rb', line 58

def restore_original_method
  if method_exists?(hidden_method)
    begin
      stubbee.__metaclass__.send(:alias_method, method, hidden_method)
      stubbee.__metaclass__.send(:remove_method, hidden_method)
    rescue NameError
      # deal with nasties like ActiveRecord::Associations::AssociationProxy
    end
  end
end

#stubObject



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

def stub
  hide_original_method
  define_new_method
end

#to_sObject



86
87
88
# File 'lib/mocha/class_method.rb', line 86

def to_s
  "#{stubbee}.#{method}"
end

#unstubObject



19
20
21
22
23
24
25
26
# File 'lib/mocha/class_method.rb', line 19

def unstub
  remove_new_method
  restore_original_method
  mock.unstub(method.to_sym)
  unless mock.any_expectations?
    reset_mocha
  end
end