Найдите или создайте запись через factory_girl ассоциацию

У меня есть модель 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 |

и это может только работать, если ассоциация используется в определении Фабрики.

60
задан 22 August 2011 в 13:10

2 ответа

Я столкнулся с подобной проблемой в последнее время и здесь - то, что я попробовал.

Для обеспечения 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 переопределяется для выборки существующей записи, если существует, вместо того, чтобы пытаться всегда создать новую запись.

я записал статья , объяснив это.

0
ответ дан 1 November 2019 в 10:05

Я имел подобную проблему и предложил это решение. Это ищет группу по имени и если найдено, что это связывает пользователя с той группой. Иначе это создает группу тем именем и затем связывается с ним.

factory :user do
  group { Group.find_by(name: 'unique_name') || FactoryBot.create(:group, name: 'unique_name') }
end

я надеюсь, что это может полезным для кого-то :)

0
ответ дан 1 November 2019 в 10:05

Другие вопросы по тегам:

Похожие вопросы: