2012-02-04 14 views
11

मैं मॉड्यूल को किसी rspec संदर्भ (उर्फ describe) में कैसे मिला सकता हूं, जैसे मॉड्यूल के स्थिरांक spec के लिए उपलब्ध हैं?किसी मॉड्यूल को किसी 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 निरंतर प्राप्त कर सकते हैं यही कारण है कि। आरएसपीसी के उत्सुक व्यवहार का कारण क्या है?

मैं एमआरआई 1.9.1 और आरएसपीसी 2.8.0 का उपयोग कर रहा हूं। एमआरआई 1.8.7 के साथ लक्षण समान हैं।

+0

आप किस रूबी संस्करण का उपयोग कर रहे हैं? –

+0

@ जॉन, एमआरआई 1.9.1 –

उत्तर

10

आप उपयोग कर सकते हैं RSpec के shared_context:

shared_context 'constants' do 
    FOO = 1 
end 

describe Model do 
    include_context 'constants' 

    p FOO # => 1 
end 
+0

यह थोड़ी देर हो गया है क्योंकि मैंने rspec के बारे में एक नई अच्छी बात सीखी है। बहुत अच्छा। – steve

11

आप extend, नहीं include चाहते हैं। यह रूबी 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 
+0

मैंने 'विस्तार' भी करने की कोशिश की, लेकिन मुझे अभी भी 'NameError' मिला है। यहां तक ​​कि अजनबी, जब मैंने 'फू' और 'पी (स्थिरांक - ऑब्जेक्ट.कॉन्स्टेंट्स)' की कोशिश की, तो स्थिर 'एक्स' स्पष्ट रूप से सूची में है, लेकिन मैं इसे सीधे संदर्भित नहीं कर सकता - केवल' const_get' के माध्यम से। यह रूबी 1.8.7 है। – Brandan

+0

@ ब्रैंडन, 'विस्तार' यहां या तो काम नहीं किया था। –

+0

1.8.7 में, 'विस्तार' आरएसपीईसी संदर्भ में थोड़ा अलग काम करता है। मैं 1.9.3 पर हूँ। –

संबंधित मुद्दे