2011-05-16 14 views
8

Estoy un poco confundido acerca de lo que está sucediendo con las especificaciones del controlador de andamio que genera rspec. Parecía tener sentido hasta que agregué la autorización a mi aplicación y ahora necesito actualizar mis pruebas.¿Qué está pasando aquí: rspec stub (: new) .with ...?

MyClass.stub(:new).with('these' => 'params') { mock_my_class(:save => true) } 

En mi controlador combino un hash en params cuando se crea un nuevo registro (que necesita el id current_user ser válida). MyClass.new (params [: my_class] .merge (: user_id => current_user.id)) falla

prueba

expected: ({"these"=>"params"}) 
got: ({"these"=>"params", "user_id"=>315}) 

Tiene sentido que la prueba falla porque el nuevo método recibe params didn' Esperar Esperaba recibir {'these' => 'params'} pero en realidad recibió {'these' => 'params', 'user_id' => 1234}

Así que mi reacción natural es ajustar la prueba porque el El nuevo método debería recibir {'these' => 'params', 'user_id' => 1234} y devolver el objeto simulado.

Así que añadir a la prueba de la siguiente manera:

MyClass.stub(:new).with({'these' => 'params', 'user_id' => @user.id}) { mock_my_class(:save => true) } 

Aquí es donde se tiran a través de un bucle. La salida de la prueba es el siguiente:

expected: ({"these"=>"params", "user_id"=>298}) 
got: ({"these"=>"params"}) 

Parece como si una prueba exitosa me está evadiendo mágicamente. Estoy seguro de que hay una razón lógica para estos resultados, pero parece que no puedo resolverlos.

¿Algún ayuda? :)

nota:

El sitio de rspec dice lo siguiente:

Account.should_receive(:find).with("37").and_return(account) 

o

Account.stub!(:find).and_return(account) 

Esto es bastante fácil de seguir que sólo parece extraña la del andamio generada no lo haría contienen estos métodos (a menos que haga un error en algo que es posible (:)


pases

login_admin 
describe "with valid params" do 
    it "assigns a newly created forum_sub_topic as @forum_sub_topic" do 
    ForumSubTopic.stub(:new) { mock_forum_sub_topic(:save => true) } 
    ForumSubTopic.should_receive(:new).with({"these"=>"params", "user_id"=> @admin.id}) #PASS! 
    post :create, :forum_sub_topic => {'these' => 'params'} 
    assigns(:forum_sub_topic).should be(mock_forum_sub_topic) #PASS! 
    end 
end 

falla

login_admin 
describe "with valid params" do 
    it "assigns a newly created forum_sub_topic as @forum_sub_topic" do 
    ForumSubTopic.stub(:new).with({'these' => 'params', 'user_id' => @user.id}) { mock_forum_sub_topic(:save => true) } 
    post :create, :forum_sub_topic => {'these' => 'params'} 
    assigns(:forum_sub_topic).should be(mock_forum_sub_topic) 
    end 
end 
+0

sería bueno ver la totalidad de su código rspec para esto en lugar de solo el trozo de nuevo. A menudo encuentro que me olvido de anular todo el comportamiento del modelo (ya que solo estamos probando si el controlador se comporta correctamente dado que se supone que el modelo funciona correctamente). – jaydel

+0

Agregué más detalles. Este es el único ejemplo que falla. –

Respuesta

4

"Nunca confíes en un drogadicto", como dice el dicho. También se podría decir, "nunca confíes en un andamio".

OK, eso está siendo un poco demasiado duro. El andamio hace todo lo posible para determinar qué parámetros funcionarán para los modelos/controladores que está generando, pero no conoce los recursos anidados (que es lo que supongo que está utilizando), por lo que no generará el user_id en el hash de params.Añadir que:

post :create, :forum_sub_topic => {:user_id=>@user.id} 

La clave these_params se genera como un ejemplo - y eliminar y añadir lo que los parámetros son necesarios para el controlador para crear un MyClass.

En cuanto a la opción with: stub y should_receive sólo habrá apagar los mensajes que cumplan las condiciones especificadas, es decir, si lo hace:

MyClass.stub(:new) {mock_model(MyClass,:save=>true)} 

Entonces MiClase responderá a cualquier new mensaje con la maqueta. Si, por el contrario, lo hace:

MyClass.stub(:new).with({:bogus=>37}) {mock_model(MyClass,:save=>true)} 

Entonces MiClase sólo responderá a new cuando también recibe {:bogus=>37} como argumento.

+0

Esto es muy útil. Gracias. Sin embargo, una cosa es que user_id no se pasa en los params en producción, por lo que la prueba no simula con precisión el comportamiento. No estoy seguro si esto es importante. –

Cuestiones relacionadas