Я использую последовательность в Factory Girl, чтобы получить уникальные значения, но я получаю ошибки проверки - PullRequest
7 голосов
/ 19 марта 2010

У меня есть модель, определенная таким образом

class Lga < ActiveRecord::Base
  validates_uniqueness_of :code
  validates_presence_of :name
end 

Я определил фабрику для Lgas с

Factory.sequence(:lga_id) { |n| n + 10000 }

Factory.define :lga do |l|
  id = Factory.next :lga_id
  l.code "lga_#{id}"
  l.name "LGA #{id}"
end

Однако, когда я бегу

Factory.create(:lga)
Factory.create(:lga)

в script/console Я получаю

>> Factory.create(:lga)
=> #<Lga id: 2, code: "lga_10001", name: "LGA 10001", created_at: "2010-03-18  23:55:29", updated_at: "2010-03-18 23:55:29">
>> Factory.create(:lga)
ActiveRecord::RecordInvalid: Validation failed: Code has already been taken

Ответы [ 2 ]

7 голосов
/ 19 марта 2010

Проблема заключалась в том, что атрибуты code и name не были так называемыми ленивыми атрибутами . Я думал написать что-то вроде:

Factory.define :lga do |l|
  l.code { |n| "lga_#{n+10000}" }
end

но я хотел повторно использовать идентификатор в атрибуте name. Вы можете убедиться id вычисляется каждый раз, когда вызывается Factory.create, помещая его в after_build хук.

Factory.define :lga do |l|
   l.after_build do |lga|
     id = Factory.next :lga_id
     lga.code = "lga_#{id}"
     lga.name = "LGA #{id}"
   end
end

Это работает только в FactoryGirl 1.2.3 и выше.

2 голосов
/ 10 июля 2012

Предыдущий ответ по-прежнему правильный, но в новых версиях FactoryGirl вы получите предупреждение.

Factory.next has been depreciated. Use FactoryGirl.generate instead.

Новый код должен выглядеть следующим образом:

Factory.define :lga do |l|
   l.after_build do |lga|
     id = FactoryGirl.generate :lga_id
     lga.code = "lga_#{id}"
     lga.name = "LGA #{id}"
   end
end

Источник: http://notesofgreg.blogspot.co.uk/2012/07/foolproof-factorygirl-sequence.html

...