我的factories.rb
文件变得太大而无法维护,我现在正试图将其拆分到factories
目录中的许多文件中。问题是我不知道如何处理依赖关系。
长话短说,我试图以下列方式分割我的工厂。所有序列都转到sequences.rb
文件,每个工厂定义都转到单独的文件中,如下所示:
的工厂/ 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
知道应该加载哪些文件的序列?答案 0 :(得分:6)
您只需使用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: "person1@example.com",
. . .>
答案 1 :(得分:1)
我是这样做的:
工厂
shared_factories
创建共享文件,例如shared_factories/sequences.rb
将sequences.rb
导入每个工厂文件。
require_relative '../shared_factories/sequences'
完整的例子:
https://gist.github.com/alexkojin/6a2d70f84ff91c37315d1d3edb0d8e6b
答案 2 :(得分:-2)
你可以这样做:
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
有各种各样的方法来构建你的工厂女孩工厂,如性状,继承,回调等。我刚刚了解了特征,这真的很棒:
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