FactoryBot фабрика со статическими атрибутами - PullRequest
0 голосов
/ 13 января 2019

Я хочу создать интеграционный тест для сериализации XML, который извлекает данные из базы данных, а затем создает файлы XML. Мне нужно иметь несколько фабрик со статическими атрибутами, т. Е. Они всегда имеют одинаковые значения, чтобы можно было устанавливать ожидания для сгенерированного XML.

Так, например, на моей User фабрике у меня есть:

  factory :static_user, class: User do
    id { '78474912-7728-4478-8810-151a1347d546' }
    role { :admin }
    email { 'john.root@mail.com' }
    password { 'password' }
    password_confirmation { 'password' }
    created_at { Time.parse 'Wed, 26 Sep 2018 11:06:59 UTC +00:00' }
    updated_at { Time.parse 'Wed, 26 Sep 2018 11:06:59 UTC +00:00' }
  end

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

FactoryBot.define do
  factory :static_order, class: Order do
    association :user, factory: :static_user do
      initialize_with { User.find_or_initialize_by(build(:static_user)) }
    end
  end
end

Как мне этого избежать?

Я мог бы использовать DatabaseCleaner gem, чтобы база данных была пустой перед каждым тестом, но я получу и ошибку дублированных атрибутов (которые имеют уникальную проверку), если я попытаюсь создать список элементов.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Используя ссылки @max, я в итоге получаю осветители, которые имеют смысл, поскольку они могут быть запущены в транзакции и предоставляют статические значения.

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

0 голосов
/ 13 января 2019

Боюсь, что создание нового User для каждого create(:static_order) - желаемое поведение.

Установка id на заводе прекратится при создании нескольких пользователей. Вместо этого вы можете использовать последовательность или установить идентификатор самостоятельно при создании экземпляров пользователей, чтобы вы по-прежнему управляли идентификатором. Если вы хотите, чтобы ваши заказы принадлежали одному и тому же пользователю, вам нужно явно передать их.

let(:user) { create(:user, id: '78474912-7728-4478-8810-151a1347d546') }
let!(:order1) { create(:static_order, user: user) }
let!(:order2) { create(:static_order, user: user) }
...