Как проверить метод обновления в Rails - PullRequest
23 голосов
/ 12 июня 2011

Я борюсь с тестированием метода обновления в Rails. Я использую стандартную встроенную среду тестирования (test::unit) и Rails 3.0.8. Я создал минимальное приложение для тестирования этого сейчас, но я не могу заставить его работать. Вот что я делаю:

Я создаю новое приложение пустых рельсов:

rails new testapp

Создайте модель под названием Коллекция:

rails generate model collection name:string

Запустить рейк БД: мигрировать:

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

Испытательные приборы - это настройки по умолчанию (collection.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.

Может кто-нибудь объяснить мне, что я делаю не так, пожалуйста?

Ответы [ 3 ]

17 голосов
/ 12 июня 2011

Вы можете сделать утверждения для переменной экземпляра, которая создается во время ответа HTTP:

test "should update collection" do
  put :update, :id => collections(:one), :collection => {:name => 'MyString2'}
  assert_equal "MyString2", assigns(:collection).name
end
15 голосов
/ 12 июня 2011

Вы перезагружаете данные прибора вместо чтения из базы данных.Попробуйте что-то вроде

assert_equal "MyString2", Collection.find(collections(:one)).name

Возможно, вам потребуется указать идентификатор в приборе.

Отказ от ответственности: Я не проверял это.

3 голосов
/ 05 августа 2013

Мой любимый вариант:

test "should update collection" do
  coll = collections(:one)
  put :update, :id => coll, :collection => {:name => "MyString2"}
  assert_equal "MyString2", coll.reload.name
end

Трюк assigns(:collection) не гарантирует, что запись была сохранена.Это может не быть проблемой или неожиданностью.

...