tests spectroscopy run rails how describe rspec

spectroscopy - rspec let



Problema con la variable de instancia y Rspec 2.x (3)

Estoy usando Rspec 2.0. No entiendo cómo funciona el alcance aquí ... ¿De alguna manera puedes leer la variable en cualquier bloque pero no puedo actualizarlo? ¿porqué es eso?

describe ''Test App'' do before(:all) do @test= :blah end it ''test'' do @test=:bye p @test # => prints bye end it ''test'' do p @test # => prints blah rather than bye... end end


Esto es realmente una propiedad de ruby ​​y no de RSpec. El bloque anterior es una devolución de llamada invocada antes de que se ejecute cada bloque. Así que así es como tu instancia se instancia para blah . Cuando en su segunda prueba lo define como adiós, esa definición se redefine cuando se invoca nuevamente el bloque anterior para la próxima prueba.


De acuerdo con el libro de RSpec , before(:all) :

... se ejecuta una vez y solo una vez en su propia instancia de Object, pero sus variables de instancia se copian a cada instancia en la que se ejecutan los ejemplos. Una palabra de advertencia al usar esto: en general, queremos que cada ejemplo se ejecute en completo aislamiento el uno del otro. Tan pronto como comenzamos a compartir estado a través de ejemplos, cosas inesperadas comienzan a suceder.

Por lo tanto, en sus ejemplos, @blah se copia antes de ejecutar cada prueba, por lo tanto, los valores asignados no se @blah de un ejemplo a otro.

Parece que quieres hacer algo como esto (código de aire):

it "gets a token" do @token = OAuth.some_method_that_returns_a_token end it "uses that token to access some OAuth feature" do result = OAuth.some_feature(@token) result.should be_something_something end

Esto huele como una prueba de OAuth, no de tu código. Debería considerar anular el método some_feature (más código de aire):

it "responds in some way when I use a valid token" do @token = mock(''token'') OAuth.should_receive(:some_feature).with(@token).and_return("success") result = my_code_which_uses_ouath(@token) result.should == "success" end


Me encuentro con el mismo problema y lo solucioné con Hash en el que cambio valores:

describe "carry over value" do let (:global) { Hash.new } before :all do global[:var1] = "foo" end it "should be foo" do global[:var1].should == "foo" end it "set to bar" do global[:var1] = "bar" global[:var1].should == "bar" end it "should still be bar" do global[:var1].should == "bar" end end