123456789_123456789_123456789_123456789_123456789_

Class: RSpec::Mocks::ConstantMutator

Relationships & Source Files
Namespace Children
Classes:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Inherits: Object
Defined in: rspec-mocks/lib/rspec/mocks/mutate_const.rb

Overview

Provides a means to stub constants.

Class Method Summary

::RSpec::Support::RecursiveConstMethods - Extended

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

Class Method Details

.hide(constant_name)

Note:

It’s recommended that you use hide_const in your examples. This is an alternate public API that is provided so you can hide constants in other contexts (e.g. helper classes).

Hides a constant.

Parameters:

  • constant_name (String)

    The fully qualified name of the constant. The current constant scoping at the point of call is not considered.

See Also:

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/mutate_const.rb', line 131

def self.hide(constant_name)
  mutate(ConstantHider.new(constant_name, nil, {}))
  nil
end

.mutate(mutator)

This method is for internal use only.

Uses the mutator to mutate (stub or hide) a constant. Ensures that the mutator is correctly registered so it can be backed out at the end of the test.

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/mutate_const.rb', line 320

def self.mutate(mutator)
  ::RSpec::Mocks.space.register_constant_mutator(mutator)
  mutator.mutate
end

.raise_on_invalid_const

This method is for internal use only.

Used internally by the constant stubbing to raise a helpful error when a constant like “A::B::C” is stubbed and A::B is not a module (and thus, it’s impossible to define “A::B::C” since only modules can have nested constants).

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/mutate_const.rb', line 331

def self.raise_on_invalid_const
  lambda do |const_name, failed_name|
    raise "Cannot stub constant #{failed_name} on #{const_name} " \
          "since #{const_name} is not a module."
  end
end

.stub(constant_name, value, options = {}) ⇒ Object

Note:

It’s recommended that you use stub_const in your examples. This is an alternate public API that is provided so you can stub constants in other contexts (e.g. helper classes).

Stubs a constant.

Parameters:

  • constant_name (String)

    The fully qualified name of the constant. The current constant scoping at the point of call is not considered.

  • value (Object)

    The value to make the constant refer to. When the example completes, the constant will be restored to its prior state.

  • options (Hash) (defaults to: {})

    Stubbing options.

Options Hash (options):

  • :transfer_nested_constants (Boolean, Array<Symbol>)

    Determines what nested constants, if any, will be transferred from the original value of the constant to the new value of the constant. This only works if both the original and new values are modules (or classes).

Returns:

  • (Object)

    the stubbed value of the constant

See Also:

[ GitHub ]

  
# File 'rspec-mocks/lib/rspec/mocks/mutate_const.rb', line 107

def self.stub(constant_name, value, options={})
  unless String === constant_name
    raise ArgumentError, "`stub_const` requires a String, but you provided a #{constant_name.class.name}"
  end

  mutator = if recursive_const_defined?(constant_name, &raise_on_invalid_const)
              DefinedConstantReplacer
            else
              UndefinedConstantSetter
            end

  mutate(mutator.new(constant_name, value, options[:transfer_nested_constants]))
  value
end