module Spy::Mock
def args_for_method(method)
def args_for_method(method) args = method.parameters args.map! do |type,name| name ||= :args case type when :req name when :opt "#{name} = nil" when :rest "*#{name}" end end args.compact! args << "&mock_method" args.join(",") end
def classes_to_override_methods(mod)
def classes_to_override_methods(mod) method_classes = mod.ancestors method_classes.shift method_classes.delete(self) CLASSES_NOT_TO_OVERRIDE.each do |klass| index = method_classes.index(klass) method_classes.slice!(index..-1) if index end method_classes end
def get_inherited_methods(klass_ancestors, visibility)
def get_inherited_methods(klass_ancestors, visibility) instance_methods = klass_ancestors.map do |klass| klass.send("#{visibility}_instance_methods".to_sym, false) end instance_methods.flatten! instance_methods.uniq! instance_methods - METHODS_NOT_TO_OVERRIDE end
def included(mod)
def included(mod) method_classes = classes_to_override_methods(mod) mocked_methods = [] [:public, :protected, :private].each do |visibility| get_inherited_methods(method_classes, visibility).each do |method_name| mocked_methods << method_name args = args_for_method(mod.instance_method(method_name)) mod.class_eval <<-DEF_METHOD, __FILE__, __LINE__ + 1 def #{method_name}(#{args}) raise ::Spy::NeverHookedError, "'#{method_name}' was never hooked on mock spy." end DEF_METHOD mod.send(visibility, method_name) end end mod.define_singleton_method(:mocked_methods) do mocked_methods end end
def initialize(&mock_method)
def initialize(&mock_method) Agency.instance.recruit(self) end
def instance_of?(other)
-
(Boolean)
-
Parameters:
-
other
(Class
) --
def instance_of?(other) other == self.class end
def method(method_name)
-
(Method)
-
Parameters:
-
method_name
(Symbol, String
) --
def method(method_name) new_method = super parameters = new_method.parameters if parameters.size >= 1 && parameters.last.last == :mock_method self.class.instance_method(method_name).bind(self) else new_method end end
def new(klass)
-
(Class)
-
Parameters:
-
klass
(Class
) --
def new(klass) mock_klass = Class.new(klass) mock_klass.class_exec do alias :_mock_class :class private :_mock_class define_method(:class) do klass end include Mock end mock_klass end