Как смешать модуль в контекст rspec
Как я могу смешать модуль в контекст rspec (он же describe
), чтобы константы модуля были доступны спецификации?
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?
Я использую МРТ 1.9.1 и rspec 2.8.0. Симптомы те же, что и при МРТ 1.8.7.
2 ответа:
Вы можете использовать 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