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



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

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

#eql?(other) ⇒ Boolean Also known as: ==

Returns:

  • (Boolean)


72
73
74
75
# File 'lib/mocha/class_method.rb', line 72

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

#hidden_methodObject



62
63
64
65
66
67
68
69
70
# File 'lib/mocha/class_method.rb', line 62

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



29
30
31
32
33
34
35
36
37
# File 'lib/mocha/class_method.rb', line 29

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

#method_exists?(method) ⇒ Boolean

Returns:

  • (Boolean)


83
84
85
86
87
# File 'lib/mocha/class_method.rb', line 83

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



25
26
27
# File 'lib/mocha/class_method.rb', line 25

def mock
  stubbee.mocha
end

#remove_new_methodObject



47
48
49
# File 'lib/mocha/class_method.rb', line 47

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

#restore_original_methodObject



51
52
53
54
55
56
57
58
59
60
# File 'lib/mocha/class_method.rb', line 51

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



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

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

#unstubObject



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

def unstub
  remove_new_method
  restore_original_method
  stubbee.reset_mocha
end