tests test spec rails how ruby-on-rails functional-testing

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