Константы области видимости для контекста rspec - PullRequest
18 голосов
/ 08 марта 2011

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

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 ​​не ограничивает константы замыканиям, поэтому они просачиваются.У кого-нибудь есть хитрость для объявления констант, которые ограничены контекстом?

Ответы [ 2 ]

22 голосов
/ 17 мая 2011

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

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

20 голосов
/ 12 апреля 2013

Теперь я использовал 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
...