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
# 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)


68
69
70
71
# File 'lib/mocha/class_method.rb', line 68

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

#hidden_methodObject



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

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)


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

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



43
44
45
# File 'lib/mocha/class_method.rb', line 43

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

#restore_original_methodObject



47
48
49
50
51
52
53
54
55
56
# File 'lib/mocha/class_method.rb', line 47

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



75
76
77
# File 'lib/mocha/class_method.rb', line 75

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