lib/with_model/constant_stubber.rb
# frozen_string_literal: true
module WithModel
class ConstantStubber
def initialize(const_name)
@const_name = const_name.to_sym
@namespace = nil
@original_value = nil
end
def stub_const(value)
@namespace = namespace
if @namespace.const_defined?(basename)
@original_value = @namespace.const_get(basename)
@namespace.__send__ :remove_const, basename
end
@namespace.const_set basename, value
end
def unstub_const
if @namespace
@namespace.__send__ :remove_const, basename
@namespace.const_set basename, @original_value if @original_value
@namespace = nil
end
@original_value = nil
end
private
def namespace
*namespace_parts, _ = lookup_list
namespace_parts.reduce(Object) do |ns, ns_part|
ns.const_get(ns_part.to_sym)
end
end
def lookup_list
@const_name.to_s.split('::')
end
def basename
@basename ||= lookup_list.last
end
end
private_constant :ConstantStubber
end