2012-02-04 6 views
11

Come posso mescolare un modulo in un contesto rspec (noto anche come describe), in modo tale che le costanti del modulo siano disponibili per le specifiche?Come mescolare un modulo in un contesto 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 

Che const_get possibile recuperare il costante quando il nome della costante non può è interessante. Cosa sta causando il comportamento curioso di rspec?

Sto usando MRI 1.9.1 e rspec 2.8.0. I sintomi sono gli stessi con MRI 1.8.7.

+0

Quale versione di Ruby stai usando? –

+0

@John, MRI 1.9.1 –

risposta

10

È possibile utilizzare di shared_context RSpec:

shared_context 'constants' do 
    FOO = 1 
end 

describe Model do 
    include_context 'constants' 

    p FOO # => 1 
end 
+0

È passato un po 'di tempo da quando ho imparato una cosa interessante su rspec. Molto bella. – steve

11

Volete extend, non include. Questo funziona in Ruby 1.9.3, per esempio:

module Foo 
    X = 123 
end 

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

In alternativa, se si desidera riutilizzare un contesto RSpec attraverso diversi test, utilizzare 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 

Se si desidera riutilizzare le specifiche in tutta diversa contesti, usare shared_examples e 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

Ho provato anche 'extend', ma ho ancora un' NameError'. Ancora più strano, quando ho provato 'include Foo' e' p (constants - Object.constants) ', la costante' X' è chiaramente nella lista, ma non posso fare riferimento direttamente - solo tramite 'const_get'. Questo è Ruby 1.8.7. – Brandan

+0

@Brandan, anche 'extend' non ha funzionato qui. –

+0

In 1.8.7, 'extend' funziona in modo leggermente diverso nel contesto di RSpec. Sono a 1.9.3. –