Ответ 1
Вы можете использовать RSpec shared_context
:
shared_context 'constants' do
FOO = 1
end
describe Model do
include_context 'constants'
p FOO # => 1
end
Как я могу объединить модуль в контексте rspec (aka describe
), так что константы модуля доступны для spec?
module Foo
FOO = 1
end
describe 'constants in rspec' do
include Foo
p const_get(:FOO) # => 1
p FOO # uninitialized constant FOO (NameError)
end
То, что const_get
может получить константу, когда имя константы не может быть интересно. Что вызывает любопытное поведение rspec?
Я использую MRI 1.9.1 и rspec 2.8.0. Симптомы совпадают с МРТ 1.8.7.
Вы можете использовать RSpec shared_context
:
shared_context 'constants' do
FOO = 1
end
describe Model do
include_context 'constants'
p FOO # => 1
end
Вы хотите extend
, а не include
. Это работает в Ruby 1.9.3, например:
module Foo
X = 123
end
describe "specs with modules extended" do
extend Foo
p X # => 123
end
В качестве альтернативы, если вы хотите повторно использовать контекст RSpec для разных тестов, используйте shared_context
:
shared_context "with an apple" do
let(:apple) { Apple.new }
end
describe FruitBasket do
include_context "with an apple"
it "should be able to hold apples" do
expect { subject.add apple }.to change(subject, :size).by(1)
end
end
Если вы хотите повторно использовать спецификации в разных контекстах, используйте shared_examples
и it_behaves_like
:
shared_examples "a collection" do
let(:collection) { described_class.new([7, 2, 4]) }
context "initialized with 3 items" do
it "says it has three items" do
collection.size.should eq(3)
end
end
end
describe Array do
it_behaves_like "a collection"
end
describe Set do
it_behaves_like "a collection"
end