rex/mocks/constants/spec/constants_spec.rb

tests/_examples/rex/mocks/constants/spec/constants_spec.rb in the metorex repository.

module Billing
  RATE = 5

  class Gateway
    TIMEOUT = 30
  end
end

RSpec.describe "constant stubbing" do
  it "replaces a defined constant" do
    stub_const("Billing::RATE", 7)
    expect(Billing::RATE).to eq(7)
  end

  it "defines an undefined constant and its parent modules" do
    stub_const("Reports::Monthly::LIMIT", 3)
    expect(Reports::Monthly::LIMIT).to eq(3)
  end

  it "hides a constant" do
    hide_const("Billing::RATE")
    expect(defined?(Billing::RATE)).to be_nil
  end

  it "transfers nested constants when asked" do
    stub_const("Billing::Gateway", Class.new, transfer_nested_constants: true)
    expect(Billing::Gateway::TIMEOUT).to eq(30)
  end

  it "reports what a stub replaced" do
    stub_const("Billing::RATE", 9)
    original = RSpec::Mocks::Constant.original("Billing::RATE")
    expect([original.stubbed?, original.previously_defined?, original.original_value]).to eq([true, true, 5])
  end

  it "refuses a name that is not a String" do
    stub_const(:RATE, 1)
  end

  it "puts every constant back after each example" do
    expect([Billing::RATE, defined?(Reports)]).to eq([5, nil])
  end
end