Как разрешить неквалифицированный доступ к константам модуля в тестах Rspe c? - PullRequest
0 голосов
/ 15 января 2020

Хотел бы включить константы из модуля в примеры RSpe c.

Этот вопрос ищет способ разрешить безусловную ссылку на константы из модуля в примерах rspe c 3.9. Это в основном для экономии места и набора текста.

module MyConsts
  FOO = "foo"
end

RSpec.describe "Tests Module Constants" do
  it 'has unqualified access to constants.' do
    expect(FOO).to eq("foo") 
  end
end

Подходы, которые не работают:

RSpe c :: Core :: Configuration # include не подобрать константы.

Это удобный способ включить вспомогательные функции из модуля , но это не то же самое, что использование include для класса, поскольку константы не доступны должным образом.

module MyConsts
  FOO = "foo"
end

RSpec.configure do |c|
  c.include MyConsts
end

RSpec.describe "Tests Module Constants" do
  it 'has qualified access to constants.' do
    expect(MyConsts::FOO).to eq("foo")
  end

  it 'has unqualified access to constants.' do
    expect(FOO).to eq("foo") 
  end
end

Пример неквалифицированного доступа завершается неудачно. Было бы неплохо иметь возможность смешивать константы из модуля, чтобы такие примеры проходили.

Failures:
  1) Tests Module Constants has unqualified access to constants.
     Failure/Error: expect(FOO).to eq("foo")

     NameError:
       uninitialized constant FOO

Использование include в блоке describe не работает.

From ранее закрытый выпуск rspe c, можно было бы предположить, что использование include в блоке describe будет работать. Это не так.

module MyConsts
  FOO = "foo"
end

RSpec.describe "Tests Module Constants" do
  include MyConsts

  it 'has unqualified access to constants.' do
    expect(FOO).to eq("foo") 
  end
end

Копирование всех констант не является началом

Этот ответ на очень похожий вопрос предполагает использование shared_context . Хотя он и дает конечный результат, он потребует дублирования определений констант. Это проблема, поскольку их сотни, модуль констант полностью извлечен из другого проекта, и поддерживать их в актуальном состоянии - слишком много работы.

1 Ответ

1 голос
/ 15 января 2020

Один из подходов состоит в том, чтобы определить ваши тесты RSpe c в контексте модуля:

module MyConsts
  FOO = "foo"
end

module MyConsts
  RSpec.describe "Tests Module Constants" do
    it "has unqualified access to constants." do
      expect(FOO).to eq("foo")
    end
  end
end

RSpe c .describe определяет модуль, и если он определен как дочерний элемент MyConsts, тогда постоянные поиски будут пузыриться до MyConsts.

Вы также можете просто смешать MyConsts на верхнем уровне:

include MyConsts

Этот подход может быть менее желательным, так как это сделает эти константы пригодными для использования. от в любом месте , что делает их по сути глобальными, что может привести к утечкам, чем вы хотели бы.

...