Class: RSpec::Mocks::ConstantMutator::DefinedConstantReplacer Private
Do not use. This class is for internal use only.
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
BaseMutator
|
|
Instance Chain:
|
|
Inherits: |
RSpec::Mocks::ConstantMutator::BaseMutator
|
Defined in: | rspec-mocks/lib/rspec/mocks/mutate_const.rb |
Overview
Replaces a defined constant for the duration of an example.
Class Method Summary
Instance Attribute Summary
- #should_transfer_nested_constants? ⇒ Boolean readonly Internal use only
BaseMutator
- Inherited
Instance Method Summary
- #mutate Internal use only
- #reset Internal use only
- #to_constant Internal use only
- #transfer_nested_constants Internal use only
- #verify_constants_to_transfer! Internal use only
BaseMutator
- Inherited
::RSpec::Support::RecursiveConstMethods
- Included
#const_defined_on? | See additional method definition at line 31. |
#constants_defined_on | See additional method definition at line 41. |
#get_const_defined_on | See additional method definition at line 35. |
#normalize_const_name, #recursive_const_defined?, #recursive_const_get |
Instance Attribute Details
#should_transfer_nested_constants? ⇒ Boolean
(readonly)
# File 'rspec-mocks/lib/rspec/mocks/mutate_const.rb', line 268
def should_transfer_nested_constants? return true if @transfer_nested_constants return false unless RSpec::Mocks.configuration.transfer_nested_constants? @original_value.respond_to?(:constants) && @mutated_value.respond_to?(:constants) end
Instance Method Details
#mutate
[ GitHub ]# File 'rspec-mocks/lib/rspec/mocks/mutate_const.rb', line 203
def mutate @context = recursive_const_get(@context_parts.join('::')) @original_value = get_const_defined_on(@context, @const_name) @constants_to_transfer = verify_constants_to_transfer! @context.__send__(:remove_const, @const_name) @context.const_set(@const_name, @mutated_value) transfer_nested_constants end
#reset
[ GitHub ]# File 'rspec-mocks/lib/rspec/mocks/mutate_const.rb', line 223
def reset @constants_to_transfer.each do |const| @mutated_value.__send__(:remove_const, const) end @context.__send__(:remove_const, @const_name) @context.const_set(@const_name, @original_value) end
#to_constant
[ GitHub ]# File 'rspec-mocks/lib/rspec/mocks/mutate_const.rb', line 215
def to_constant const = super const.stubbed = true const.previously_defined = true const end
#transfer_nested_constants
[ GitHub ]# File 'rspec-mocks/lib/rspec/mocks/mutate_const.rb', line 232
def transfer_nested_constants @constants_to_transfer.each do |const| @mutated_value.const_set(const, get_const_defined_on(original_value, const)) end end
#verify_constants_to_transfer!
[ GitHub ]# File 'rspec-mocks/lib/rspec/mocks/mutate_const.rb', line 238
def verify_constants_to_transfer! return [] unless should_transfer_nested_constants? { @original_value => "the original value", @mutated_value => "the stubbed value" }.each do |value, description| next if value.respond_to?(:constants) raise ArgumentError, "Cannot transfer nested constants for #{@full_constant_name} " \ "since #{description} is not a class or module and only classes " \ "and modules support nested constants." end if Array === @transfer_nested_constants @transfer_nested_constants = @transfer_nested_constants.map(&:to_s) if RUBY_VERSION == '1.8.7' undefined_constants = @transfer_nested_constants - constants_defined_on(@original_value) if undefined_constants.any? available_constants = constants_defined_on(@original_value) - @transfer_nested_constants raise ArgumentError, "Cannot transfer nested constant(s) #{undefined_constants.join(' and ')} " \ "for #{@full_constant_name} since they are not defined. Did you mean " \ "#{available_constants.join(' or ')}?" end @transfer_nested_constants else constants_defined_on(@original_value) end end