Je me bats avec le test de la méthode de mise à jour dans Rails. J'utilise le standard intégré dans le cadre d'essais (test::unit
) et Rails 3.0.8. J'ai créé une application minimale pour le tester maintenant, mais je n'arrive pas à le faire fonctionner. Voici ce que je fais:Comment tester la méthode de mise à jour dans Rails
Je crée une nouvelle application Rails vide:
rails new testapp
Créer un modèle appelé Collection:
rails generate model collection name:string
Run rake db: migrate:
rake db:migrate
Créer un contrôleur appelé Collections avec une méthode de mise à jour:
rails generate controller collections update
En collection_controller.rb j'ajouter cette méthode de mise à jour minimum:
def update
@collection = Collection.find(params[:id])
@collection.update_attributes(params[:collection])
end
Les appareils de test sont les valeurs par défaut (collections.yml):
one:
name: MyString
two:
name: MyString
Puis-je ajouter cela à la collection_controller_test. rb sous fonctionnelle:
test "should update collection" do
put :update, :id => collections(:one), :collection => {:name => 'MyString2'}
assert_equal "MyString2", collections(:one).name
end
Lorsque j'exécute le test:
rake test:functionals
Il échoue avec ce message:
test_should_update_collection(CollectionsControllerTest) [/Users/atle/Documents/Rails/testapp/test/functional/collections_controller_test.rb:6]:
<"MyString2"> expected but was
<"MyString">.
Voici la sortie 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)
Dans le journal, je peux voir la déclaration UPDATE
, mais je ne vois jamais une nouvelle instruction SELECT
.
Quelqu'un pourrait-il me expliquer ce que je fais mal s'il vous plaît?
+1 pour une question clairement posée.C'est agréable de voir un nouvel utilisateur poser une question explicite avec ce niveau de détail. Votre problème provient certainement de 'collections (: one)' dans votre assertion, qui lit simplement à partir de l'appareil à la place de la base de données. Cameron et Teddy ont tous deux ceci correct ci-dessous. (BTW: Regardez dans "factory_girl" et vider les appareils complètement dès que possible, ils sont pratiques pour commencer, mais un désordre horrible plus tard.) – jdl
Donc les appareils et le db sont deux endroits distincts. J'ai supposé que les appareils sont lus dans la base de données au démarrage et que les collections (: one) lues à partir de la base de données. Merci pour le nettoyage des choses et je vais regarder dans cette factory_girl :) – Atle