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)

Returns:
  • (Boolean) -

Parameters:
  • other (Class) --
def instance_of?(other)
  other == self.class
end

def method(method_name)

Returns:
  • (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)

Returns:
  • (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