2012-02-04 18 views
11

Làm cách nào để kết hợp mô-đun vào ngữ cảnh rspec (aka describe), sao cho các hằng số của mô-đun có sẵn cho thông số?Làm thế nào để kết hợp một mô-đun vào ngữ cảnh rspec

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 có thể lấy hằng số khi tên của hằng số không thể là thú vị. Điều gì gây ra hành vi tò mò của rspec?

Tôi đang sử dụng MRI 1.9.1 và rspec 2.8.0. Các triệu chứng giống với MRI 1.8.7.

+0

Những phiên bản Ruby bạn đang sử dụng? –

+0

@ John, MRI 1.9.1 –

Trả lời

10

Bạn có thể sử dụng RSpec của shared_context:

shared_context 'constants' do 
    FOO = 1 
end 

describe Model do 
    include_context 'constants' 

    p FOO # => 1 
end 
+0

Đã lâu rồi tôi mới học được một điều mới mẻ về rspec. Rất đẹp. – steve

11

Bạn muốn extend, không include. Này hoạt động trong Ruby 1.9.3, ví dụ:

module Foo 
    X = 123 
end 

describe "specs with modules extended" do 
    extend Foo 
    p X # => 123 
end 

Ngoài ra, nếu bạn muốn sử dụng một bối cảnh RSpec qua các bài kiểm tra khác nhau, sử dụng 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 

Nếu bạn muốn sử dụng lại thông số kỹ thuật trên toàn khác nhau bối cảnh, sử dụng shared_examplesit_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 
+0

Tôi đã thử 'mở rộng' quá, nhưng tôi vẫn có một' NameError'. Ngay cả người lạ, khi tôi thử 'include Foo' và' p (hằng số - Object.constants) ', hằng số' X' rõ ràng nằm trong danh sách, nhưng tôi không thể tham chiếu trực tiếp - chỉ thông qua 'const_get'. Đây là Ruby 1.8.7. – Brandan

+0

@Brandan, 'extend' cũng không hoạt động ở đây. –

+0

Trong 1.8.7, 'extend' hoạt động hơi khác trong ngữ cảnh RSpec. Tôi đang ở trên 1.9.3. –

Các vấn đề liên quan