ruby-on-rails - rails - rspec tutorial
¿Cómo escribir una macro de controlador RSpec que pueda aceptar argumentos definidos por let o en un bloque before? (1)
Yo uso Rails 3 y RSpec 2.6.0.
No estoy seguro si eso es posible, pero esto es lo que me gustaría hacer:
describe UsersController do
let(:user) { Fabricate :user }
describe "GET /user/:id" do
should_return_401_code_if_user_is_not_confirmed :get, :show, :id => user.id
end
describe "PUT /user/:id" do
should_return_401_code_if_user_is_not_confirmed :put, :update, :id => user.id
end
end
Traté de implementar la macro así:
module ControllerMacros
def should_return_401_code_if_user_is_not_confirmed(verb, action, params = {})
it "returns a 401 code if the user is not an admin" do
send verb, action, params
response.code.should == "401"
end
end
end
Pero cuando ejecuto esas especificaciones obtengo el error undefined local variable or method ''user''
. Traté de cambiar a una @ @ variable definida en un bloque anterior, pero tampoco funciona. Sospecho que es porque no estoy en un bloque de ejemplo.
¿Es posible pasar a un controlador de macro argumentos definidos por let o en un bloque before?
¡Gracias!
Después de leer este hilo en la lista de servidores rspec-users, parece que la respuesta es no. El problema es que tus valores de let / before no se inicializan hasta que it
bloqueen en el cuerpo de tu macro, por lo que no puedes hacer referencia a ellos como parámetros a la macro llamada.
Intento hacer esencialmente lo mismo en un sitio en el que estoy trabajando. La solución que voy a utilizar es llamar al método macro con un bloque que devolverá el hash de parámetros que desee, y luego usar instance_eval
en el cuerpo de la macro para evaluar el bloque usando el alcance de la macro.
#spec
...
describe "GET /user/:id" do
should_return_401_code_if_user_is_not_confirmed :get, :show { {:id => user.id} }
end
#macro
...
def should_return_401_code_if_user_is_not_confirmed(verb, action, ¶ms_block)
it "returns a 401 code if the user is not an admin" do
params = instance_eval ¶ms_block
send verb, action, params
...