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