thoughtbot--shoulda-matchers/lib/shoulda/matchers/doublespeak/double.rb

75 lines
1.8 KiB
Ruby

module Shoulda
module Matchers
module Doublespeak
class Double
attr_reader :calls
def initialize(klass, method_name, implementation)
@klass = klass
@method_name = method_name
@implementation = implementation
@activated = false
@calls = []
end
def to_return(value = nil, &block)
if block
implementation.returns(&block)
else
implementation.returns(value)
end
end
def activate
unless @activated
store_original_method
replace_method_with_double
@activated = true
end
end
def deactivate
if @activated
restore_original_method
@activated = false
end
end
def record_call(args, block)
calls << MethodCall.new(args, block)
end
def call_original_method(object, args, block)
if original_method
original_method.bind(object).call(*args, &block)
end
end
private
attr_reader :klass, :method_name, :implementation, :original_method
def store_original_method
@original_method = klass.instance_method(method_name)
end
def replace_method_with_double
implementation = @implementation
double = self
klass.__send__(:define_method, method_name) do |*args, &block|
implementation.call(double, self, args, block)
end
end
def restore_original_method
original_method = @original_method
klass.__send__(:define_method, method_name) do |*args, &block|
original_method.bind(self).call(*args, &block)
end
end
end
end
end
end