Как разделяет определения 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
-
Создать общий файл, например. shared_factories/sequences.rb
-
Импортируйте 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