如何在多个文件中拆分factory_girl定义?

时间:2014-05-26 03:16:08

标签: ruby-on-rails factory-bot

我的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未定义错误。我可以通过将块传递给每个关联来处理这个问题(例如nameemailuser等等),但它似乎很丑陋,而不是DRY。

  1. 有没有办法让factory_girl知道应该加载哪些文件的序列?
  2. 处理复杂的依赖关系时,如果无法通过更改文件的加载顺序来修复此问题?

3 个答案:

答案 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",
 . . .>

Sequences Documentation了解详情。

答案 1 :(得分:1)

我是这样做的:

  1. 为共享工厂创建单独的文件夹。它应与“工厂”文件夹处于同一级别。
  2.   

    工厂

         

    shared_factories

    1. 创建共享文件,例如shared_factories/sequences.rb

    2. sequences.rb导入每个工厂文件。 require_relative '../shared_factories/sequences'

    3. 完整的例子:

      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