ruby on rails - test - Cómo probar el método de actualización en Rails
rspec rails (3)
Estás recargando los datos del aparato en lugar de leerlos desde la db. Intenta algo como
assert_equal "MyString2", Collection.find(collections(:one)).name
Es posible que deba especificar el ID en el dispositivo.
Descargo de responsabilidad: no he probado esto
Estoy luchando con probar el método de actualización en Rails. Estoy utilizando el marco de prueba integrado estándar ( test::unit
) y Rails 3.0.8. He creado una aplicación mínima para probar esto ahora, pero no puedo hacer que funcione. Esto es lo que hago:
Creo una nueva aplicación de rieles en blanco:
rails new testapp
Crea un modelo llamado Colección:
rails generate model collection name:string
Ejecutar rake db: migrar:
rake db:migrate
Cree un controlador llamado Colecciones con un método de actualización:
rails generate controller collections update
En collection_controller.rb agrego este método mínimo de actualización:
def update
@collection = Collection.find(params[:id])
@collection.update_attributes(params[:collection])
end
Los dispositivos de prueba son los predeterminados (collections.yml):
one:
name: MyString
two:
name: MyString
Luego agrego esto al collection_controller_test.rb bajo funcional:
test "should update collection" do
put :update, :id => collections(:one), :collection => {:name => ''MyString2''}
assert_equal "MyString2", collections(:one).name
end
Cuando corro la prueba:
rake test:functionals
Falla con este mensaje:
test_should_update_collection(CollectionsControllerTest) [/Users/atle/Documents/Rails/testapp/test/functional/collections_controller_test.rb:6]:
<"MyString2"> expected but was
<"MyString">.
Aquí están los resultados de test.log:
[1m[36mSQL (0.2ms)[0m [1m SELECT name
FROM sqlite_master
WHERE type = ''table'' AND NOT name = ''sqlite_sequence''
[0m
[1m[35mCollection Load (0.1ms)[0m SELECT "collections".* FROM "collections" WHERE "collections"."id" = 980190962 LIMIT 1
Processing by CollectionsController#update as HTML
Parameters: {"id"=>#<Collection id: 980190962, name: "MyString", created_at: "2011-06-12 13:14:13", updated_at: "2011-06-12 13:14:13">, "collection"=>{"name"=>"MyString2"}}
[1m[36mCollection Load (0.2ms)[0m [1mSELECT "collections".* FROM "collections" WHERE "collections"."id" = 980190962 LIMIT 1[0m
[1m[35mAREL (0.2ms)[0m UPDATE "collections" SET "name" = ''MyString2'', "updated_at" = ''2011-06-12 13:14:13.394135'' WHERE "collections"."id" = 980190962
Rendered collections/update.html.erb within layouts/application (1.5ms)
Completed 200 OK in 9ms (Views: 4.5ms | ActiveRecord: 1.2ms)
En el registro puedo ver la instrucción UPDATE
, pero nunca veo una nueva instrucción SELECT
.
¿Podría alguien explicarme lo que estoy haciendo mal por favor?
Mi variante favorita de esta:
test "should update collection" do
coll = collections(:one)
put :update, :id => coll, :collection => {:name => "MyString2"}
assert_equal "MyString2", coll.reload.name
end
El truco de assigns(:collection)
realidad no garantiza que se guardó el registro. Esto puede no ser un problema, o puede ser una sorpresa.
Puede hacer afirmaciones sobre la variable de instancia que se crea durante la respuesta HTTP:
test "should update collection" do
put :update, :id => collections(:one), :collection => {:name => ''MyString2''}
assert_equal "MyString2", assigns(:collection).name
end