переход от светильников к Factory Girl

Рельсы 3.0.3....

Я только начинаю работать с Factory Girl, и у меня не было большого успеха с подходом стандартных приспособлений. Я закомментировал fixtures :all из файла test/test_helper.rb и создал файл factory.

Моя проблема в том, что функция последовательности не работает:

# test/factories.rb
Factory.sequence :clearer_name do |n|
   "Clearer_#{n}"
end

Factory.define :clearer do |f|
   f.name Factory.next(:clearer_name)
end

Мой (функциональный) тест лишь немного отличается от стандартного:

require 'test_helper'

class ClearersControllerTest < ActionController::TestCase
   setup do
      @clearer = Factory.create(:clearer)
   end

test "should get index" do
   get :index
   assert_response :success
   assert_not_nil assigns(:clearers)
 end

 test "should get new" do
   get :new
   assert_response :success
 end

 test "should create clearer" do
   assert_difference('Clearer.count') do
     post :create, :clearer => @clearer.attributes
   end

   assert_redirected_to clearer_path(assigns(:clearer))
 end

Когда я запускаю rake test, я получаю:

test_should_create_clearer(ClearersControllerTest):
ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: column name is not unique: INSERT INTO "clearers" ("active", "updated_at", "name", "created_at") VALUES ('t', '2011-02-20 08:53:37.040200', 'Clearer_1', '2011-02-20 08:53:37.040200')

... как будто это не продолжение последовательности.

Какие-нибудь советы?

Спасибо,

ОБНОВЛЕНИЕ: вот мой тестовый файл:

#clearers_controller_test.rb
require 'test_helper'
class ClearersControllerTest < ActionController::TestCase
  setup do
    @clearer = Factory.create(:clearer)
  end

  test "should create clearer" do

    assert_difference('Clearer.count') do
      # does not work without this:
      Clearer.destroy_all 
      post :create, :clearer => @clearer.attributes
    end
end

Я могу заставить это работать, поместив Clearer.destroy_all в начало тестового метода, как показано, но это неправильно.


person Robert Brown    schedule 20.02.2011    source источник
comment
Немного не связанно, но Rails 3.0.4 уже вышел и включает важные исправления безопасности, поэтому я рекомендую обновиться.   -  person Andrew Marshall    schedule 20.02.2011
comment
Я думаю, что вижу проблему теперь, когда вы добавили тестовый пример.   -  person jemminger    schedule 21.02.2011


Ответы (3)


Я вижу - в вашей настройке вы создаете экземпляр Clearer. Метод Factory.create создает и сохраняет новую запись и возвращает ее.

Проблема в том, что вы затем пытаетесь создать другой экземпляр в своем тесте «следует создать более четкий», но повторно используете атрибуты существующего экземпляра.

Если вы хотите, чтобы Factory возвращала свежие атрибуты (и следующую последовательность имен), вам нужно запросить у нее новые атрибуты:

test "should create clearer" do
  assert_difference('Clearer.count') do
    post :create, :clearer => Factory.attributes_for(:clearer)
  end
end

Вы должны использовать этот существующий экземпляр @clearer только в контексте существующей записи, а не там, где вы хотите создать новую.

person jemminger    schedule 21.02.2011

Я предполагаю, что вы не начинаете с новой базы данных. Это может произойти по многим причинам, но вы можете убедиться, что проблема именно в этом, добавив Clearer.destroy_all в функцию настройки перед ее созданием.

person ctide    schedule 20.02.2011

Последовательности и другие значения атрибутов, вычисляемые во время выполнения, должны быть процедурами, а не статическими значениями.

Изменять:

Factory.define :clearer do |f|
   f.name Factory.next(:clearer_name)
end

to:

Factory.define :clearer do |f|
   f.name {Factory.next(:clearer_name)}
end
person jemminger    schedule 20.02.2011