У меня есть модель User, которая принадлежит Группе. У группы должен быть атрибут уникального имени. Пользовательская фабрика и фабрика группы определяются как:
Factory.define :user do |f|
f.association :group, :factory => :group
# ...
end
Factory.define :group do |f|
f.name "default"
end
Когда первый пользователь создается, новая группа создается также. Когда я пытаюсь создать второго пользователя, это перестало работать, потому что это хочет создать ту же группу снова.
Существует ли способ сказать factory_girl методу ассоциации сначала искать существующую запись?
Примечание: Я действительно пытался определить метод для обработки этого, но затем я не могу использовать f.association. Я хотел бы смочь использовать его в Огуречных сценариях как это:
Given the following user exists:
| Email | Group |
| test@email.com | Name: mygroup |
и это может только работать, если ассоциация используется в определении Фабрики.
Я столкнулся с подобной проблемой в последнее время и здесь - то, что я попробовал.
Для обеспечения FactoryBot build
и create
все еще ведет себя, как он должен, мы должны только переопределить логику create
путем выполнения:
factory :user do
association :group, factory: :group
# ...
end
factory :group do
to_create do |instance|
instance.attributes = Group.find_or_create_by(name: instance.name).attributes
instance.reload
end
name { "default" }
end
Это удостоверяется build
, поддерживает, это - поведение по умолчанию "создания/инициализации объекта" и не выполняет чтения базы данных или пишет, таким образом, это всегда быстро. Только логика create
переопределяется для выборки существующей записи, если существует, вместо того, чтобы пытаться всегда создать новую запись.
я записал статья , объяснив это.
Я имел подобную проблему и предложил это решение. Это ищет группу по имени и если найдено, что это связывает пользователя с той группой. Иначе это создает группу тем именем и затем связывается с ним.
factory :user do
group { Group.find_by(name: 'unique_name') || FactoryBot.create(:group, name: 'unique_name') }
end
я надеюсь, что это может полезным для кого-то :)