Как разделяет определения factory_girl во многих файлах?

Мой файл factories.rb стал слишком большим, чтобы поддерживать его с течением времени, и теперь я пытаюсь разбить его на многие файлы в каталоге factories. Проблема в том, что я не знаю, как обращаться с зависимостями.

Короче говоря, я пытаюсь разбить свои фабрики следующим образом. Все последовательности идут в файл sequences.rb, и каждое определение factory переходит в отдельный файл следующим образом:

заводы /sequences.rb

FactoryGirl.define do
   sequence :name {|n| "Name #{n}" }
   sequence :email {|n| "person#{n}@example.com" }
end

заводы /user.rb

FactoryGirl.define do
    factory :user do
        name
        email
    end
end

заводы /post.rb

FactoryGirl.define do
    factory :post do
        name
        content "Post Content"
        user
    end
end

Когда я запускаю тесты, я получаю name не определенную ошибку. Я могу справиться с этим, передав блок каждой ассоциации (например, name, email, user и т.д.), Но это кажется уродливым, а не DRY.

  • Есть ли способ, чтобы factory_girl знать последовательность, в которой файлы должны быть загружены?
  • для решения сложных зависимостей, когда это невозможно устранить при изменении последовательности загрузки файлов.

Ответ 1

Вы можете просто добиться результата с помощью метода generate:

# factories/sequences.rb
FactoryGirl.define do
  sequence(:email) { |n| "person#{n}@example.com" }
end

# factories/user.rb
FactoryGirl.define do
  factory :user do
    email { generate(:email) }
    password '12345678'
  end
end

Затем попробуйте:

FactoryGirl.create :user
=> #<User:0x007fa99d2ace40
 id: 1,
 email: "[email protected]",
 . . .>

Документация последовательностей для более подробной информации.

Ответ 2

Я делаю это следующим образом:

  • Создайте отдельную папку для общих фабрик. Он должен находиться на том же уровне, что и папка "фабрики".

заводы

shared_factories

  1. Создать общий файл, например. shared_factories/sequences.rb

  2. Импортируйте sequences.rb в каждый файл factory. require_relative '../shared_factories/sequences'

Полный пример:

https://gist.github.com/alexkojin/6a2d70f84ff91c37315d1d3edb0d8e6b

Ответ 3

Вы можете сделать это:

FactoryGirl.define do
    factory :user do
        sequence(:name) {|n| "Name #{n}" }
        sequence(:email) {|n| "person#{n}@example.com" }
    end
end

FactoryGirl.define do
    factory :post do
        content "Post Content"
        user { create :user }
    end
end

Существует множество способов структурирования ваших девушек-застройщиков factory, таких как черты, наследование, обратные вызовы и т.д. Я недавно узнал о чертах, и это действительно замечательно:

FactoryGirl.define do
    factory :user do
        sequence(:name) {|n| "Name #{n}" }
        sequence(:email) {|n| "person#{n}@example.com" }
    end

    trait :with_post do
        after(:create) { |user| create :post, user: user }
    end
end

FactoryGirl.define do
    factory :post do
        content "Post Content"
        user { create :user }
    end
end

# and in your specs you will do this:
let!(:blogger) { create :user, :with_post }

Очень полезно потратить некоторое время на чтение всей документации (возможно, 30 минут?). После этого у вас будет гораздо больше идей для реорганизации ваших заводов.

Ссылка ссылки: https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md