Factory проверка уникальности девушки не подходит для связанных фабрик
У меня есть (упрощенные) заводы, определенные следующим образом:
factory :league do
acronym 'NBA'
end
factory :division do
league
end
Дивизии принадлежат Лигам. Когда я определяю этот factory, я полагал, что 1 лига будет создана, и эта лига будет повторно использоваться снова и снова, чтобы дать дивизиям реальную лигу.
Вместо этого я получаю ошибки во втором вызове FactoryGirl.create(:division)
, потому что Лига acronym
должна быть уникальной.
class League < ActiveRecord::Base
validates :acronym, uniqueness: true
end
что приводит к следующему разрыву в тесте
ActiveRecord:: RecordInvalid: не удалось выполнить проверку: уже принят Акт
Как я могу обойти это, желательно, не создавая иерархию в настройке теста?
Если для чего-то лучше, чем factory_girl, для чего я пытаюсь выполнить, предложите
Ответы
Ответ 1
Используйте initialize_with
в определении вашей лиги.
См. http://robots.thoughtbot.com/post/16196616388/factory-girl-2-5-gets-custom-constructors
Затем вы можете выдать find_or_create_by_acronym
, чтобы гарантировать его создание один раз.
Ответ 2
В зависимости от того, где вы вызываете FactoryGirl.create, записи будут созданы для каждой конкретной спецификации. То, что вы хотите, database_cleaner
, после его установки, очистит вашу базу данных после каждой спецификации, убедившись, что ваши ошибки проверки больше не являются проблемой,
ИЗМЕНИТЬ
Упс, я неправильно понял ваш вопрос. То, что вы хотите сделать, - либо использовать камень faker
для генерации случайных строк для каждого аббревиатуры или использовать последовательность factory_girl
, подобную этой
FactoryGirl.define do
sequence :acronym do |n|
"NBA#{n}"
end
factory :league do
acronym
end
end
Использование последовательности действительно гарантирует, что каждая созданная лига имеет уникальный аббревиатур.