Как протестировать метод обновления в Rails
Я борюсь с тестированием метода обновления в Rails. Я использую стандартную встроенную среду тестирования (test::unit
) и Rails 3.0.8. Я создал минимальное приложение для тестирования этого сейчас, но я не могу заставить его работать. Вот что я делаю:
Я создаю новое приложение для пустых рельсов:
rails new testapp
Создайте модель под названием Collection:
rails generate model collection name:string
Запустить rake db: migrate:
rake db:migrate
Создайте контроллер под названием Collections с методом обновления:
rails generate controller collections update
В collection_controller.rb Я добавляю этот минимальный метод обновления:
def update
@collection = Collection.find(params[:id])
@collection.update_attributes(params[:collection])
end
Тест-инструменты являются значениями по умолчанию (collections.yml):
one:
name: MyString
two:
name: MyString
Затем я добавляю это в файл collection_controller_test.rb по функциям:
test "should update collection" do
put :update, :id => collections(:one), :collection => {:name => 'MyString2'}
assert_equal "MyString2", collections(:one).name
end
Когда я запускаю тест:
rake test:functionals
С этим сообщением не получается:
test_should_update_collection(CollectionsControllerTest) [/Users/atle/Documents/Rails/testapp/test/functional/collections_controller_test.rb:6]:
<"MyString2"> expected but was
<"MyString">.
Вот результат из 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)
В журнале я могу видеть оператор UPDATE
, но я никогда не вижу нового оператора SELECT
.
Может кто-нибудь объяснить мне, что я делаю неправильно?
Ответы
Ответ 1
Вы перезагружаете данные прибора, вместо чтения из db. Попробуйте что-то вроде
assert_equal "MyString2", Collection.find(collections(:one)).name
Вам может потребоваться указать идентификатор в приборе.
Отказ от ответственности: я не тестировал это.
Ответ 2
Вы можете сделать утверждения в переменной экземпляра, которая создается во время ответа HTTP:
test "should update collection" do
put :update, :id => collections(:one), :collection => {:name => 'MyString2'}
assert_equal "MyString2", assigns(:collection).name
end
Ответ 3
Мой любимый вариант:
test "should update collection" do
coll = collections(:one)
put :update, :id => coll, :collection => {:name => "MyString2"}
assert_equal "MyString2", coll.reload.name
end
Тройка assigns(:collection)
фактически не гарантирует сохранения записи. Это может быть не проблема, или это может быть неожиданностью.