Скользящие константы в контексте rspec

Я часто хочу сделать

context "empty stack" do
  SOME_CONSTANT = "value"
  it "should be empty" do
    # use SOME_CONSTANT
  end
end

context "populated stack" do
  SOME_CONSTANT = "a different value"
  it "should have some items" do
    # use SOME_CONSTANT
  end
end

ruby ​​не ограничивает видимость для закрытий, поэтому они просачиваются. Кто-нибудь имеет трюк для объявления констант, охваченных контекстом?

Ответы

Ответ 1

Измените объявление константы:
от SOME_CONSTANT = "value"
до self::SOME_CONSTANT = "value"

RSpec создает анонимный класс для каждого набора спецификаций (контекст в вашем примере), с которым он сталкивается. Объявление константы без self:: в анонимном классе делает ее доступной в глобальной области видимости и видимой для всех спецификаций. Изменение объявления константы на self:: гарантирует, что оно видимо только внутри анонимного класса.

Ответ 2

Используя rspec дольше, я думаю, что более идиоматический подход - использовать let.

context "empty stack" do
  let(:some_constant){ "value" }

  it "should be empty" do
    puts some_constant
  end
end

context "populated stack" do
  let(:some_constant){ "a different value" }

  it "should have some items" do
    puts some_constant
  end
end