2011-06-23 10 views
7

¿Puede alguien explicar la diferencia entre los siguientes métodos para mí?RSpec - uso de lambda

it "should create a user" do 
    lambda do 
     post :create, :user => @attr 
    end.should change(User, :count).by(1) 
end 

Ese es el método tal como está actualmente. ¿Podría esto también lograrse con el método a continuación?

it "should create a user" do 
    post :create, :user => @attr 
    response.should change(User, :count).by(1) 
end 

¿Son efectivamente iguales? ¿O el segundo no funciona? Debido a que el tutorial que estoy siguiendo parece usar response siempre que sea posible, pero no lo hice en el caso anterior. ¿Puede alguien explicar la diferencia entre los dos métodos anteriores, cómo funcionan las respuestas de lambda y RSpec? ¡Gracias!

+0

El método lambda está declarando que la acción global cambia el número de usuario por 1 donde como el segundo método está indicando la respuesta cambia el Número de usuarios por +1. – basicxman

Respuesta

10

La forma lambda es equivalente a hacer esto, si la base de datos de prueba está vacía:

User.count.should == 0 
post :create, :user => @attr 
User.count.should == 1 

creo que llamar change sin necesidad de suministrar un bloque, como se muestra en el segundo ejemplo, se generará un error.

La forma lambda se utiliza para envolver una sección de código que puede ser utilizado para establecer una expectativa de una manera más conveniente después probando con antes y después de las condiciones. En las versiones más recientes de RSpec También verá este hecho con expect:

expect { 
    post :create, :user => @attr 
}.to change(User, :count).by(1)