2011-03-08 11 views
14

a menudo quieren hacerconstantes ámbito de aplicación a un contexto rspec

context "empty stack" do 
    SOME_CONSTANT = "value" 
    it "should be empty" do 
    # use SOME_CONSTANT 
    end 
end 

context "populated stack" do 
    SOME_CONSTANT = "a different value" 
    it "should have some items" do 
    # use SOME_CONSTANT 
    end 
end 

Ruby no alcance a las constantes cierres para que se filtran. ¿Alguien tiene un truco para declarar constantes que tienen un contexto dentro del contexto?

Respuesta

21

Cambiar la declaración de la constante:
de SOME_CONSTANT = "value"
a self::SOME_CONSTANT = "value"

RSpec crea una clase anónima para cada conjunto de especificaciones técnicas (contexto en el ejemplo) que se encuentra. Declarar una constante sin self:: en una clase anónima lo hace disponible en alcance global, y es visible para todas las especificaciones. Al cambiar la declaración de constantes a self::, se garantiza que solo sea visible dentro de la clase anónima.

+0

Interesante - gracias. – zetetic

+0

¡Perfecto! Gracias – opsb

+0

No funcionó para mí dentro de 'características' de Capybara. – Nakilon

14

Habiendo usado rspec durante más tiempo ahora creo que el enfoque más idiomático es usar let.

context "empty stack" do 
    let(:some_constant){ "value" } 

    it "should be empty" do 
    puts some_constant 
    end 
end 

context "populated stack" do 
    let(:some_constant){ "a different value" } 

    it "should have some items" do 
    puts some_constant 
    end 
end 
+2

Recomiendo totalmente usar las construcciones 'let'. Lea más sobre 'let' aquí: https://www.relishapp.com/rspec/rspec-core/docs/helper-methods/let-and-let – Nicolas

+0

Quiero usar' let' pero no está disponible en el anterior bloques. – 23inhouse

+0

Eso no es verdad. Las definiciones con 'let' están disponibles en' before', 'before (: each)' y 'before (: suite)'. Solo que no funcionan con 'before (: all)'. – brainbag

Cuestiones relacionadas