在db/seeds中如何使用FactoryBot?

35

这个能做到吗?

如果可以,你如何做到呢?

注意:FactoryBot 以前叫做 FactoryGirl。


2
db/seeds.rb 应该包含生产环境所需的核心数据,以使您的网站运行。工厂应仅在测试中使用,帮助您在隔离环境中执行操作。您只是想让您的 db/seeds 更短或者有其他目的吗? - mnelson
6个回答

31
你只需在 db/seeds.rb 文件中添加require 'factory_bot_rails',即可访问你的工厂。
注意:Gem 以前称为 FactoryGirlRails。

11
很好,但请确保在Gemfile中加入"require => false"以便于使用factory_girl_rails时避免初始化依赖问题。如果你在db:migrate时使用了还未迁移的模型工厂,这个问题就会出现。然后在spec_helper中需要添加'require 'factory_girl_rails''语句。 - Joe Sak

18

5
使用Factory Girl 在种子文件中的一个好理由是,我们的 ActiveRecord 种子文件每当有人更新 API 时就会出现错误,而且这些错误往往没有任何警告。为了防止这种情况发生,我们希望测试覆盖种子文件。Factory Girl 可以帮助种子和测试两个方面。 - Jan Werkhoven
3
我从来没有完全理解那篇文章。我的猜测是他们指的是仅将其用于该目的。如果您已经有几个用于测试的工厂,并且您已经保持了最新状态,那么重复使用它们而不是重写该逻辑是非常有意义的。 - thisismydesign

15

(这个答案适用于 Rails 3.0.7)

我发现问题在于如何设置Gemfile - 你需要按以下方式进行操作:

gem 'factory_girl'

group :test do
  gem 'factory_girl_rails'
end

我们发现在:test环境之外使用了factory_girl_rails,但我们没有找到问题的根本原因(可能与Rails类缓存的方式有关?)

一旦解决了这个问题,我想实际从lib库加载数据,类似于...

require 'factory_girl'
require 'spec/factories/user_factory'

module Seeds

  class SampleUsers

    def self.run
    u = Factory(:user)
  end
end

然后可以通过在 db:seed 中运行该方法来执行此方法。

Seeds::SampleUsers.run

2
请参考Hubble在Michael的回答中的评论,以了解制作Gemfile工作的另一种方法。看起来factory_girl_rails可以安全地在db/seeds中要求,但不应该通过Bundler由Rails自动要求。为了防止发生这种情况,Hubble设置了:require => false。 - Benjamin Atkin
很棒的答案!正是我所需要的。我发现如果有两个require语句,就会出现错误。因此,在我的实现中我没有使用它们。 - BeeZee
在Rails 4中不再需要这样做:你可以使用group :development, :test do gem 'factory_girl_rails' 只需要在lib/tasks/sample_data.rake中调用'require'factory_girl_rails'即可。 - Gwyn Morfey

14

在 db/seeds.rb 文件中

require 'factory_girl_rails'

10.times do
  FactoryGirl.create :user
end

8
FactoryGirl.create_list(:user, 10) - Alexander Revutsky

3
在Rails 5.2.6中,你可以在db/seeds.rb文件中创建工厂。在seeds.rb文件的顶部添加include FactoryBot::Syntax::Methods。在该行下面,你可以创建工厂,例如:user1 = create(:user)
# db/seeds.rb
include FactoryBot::Syntax::Methods

user1 = create(:user)

这个很好!唯一需要考虑的是,将你的工厂放在spec/factories之外的某个地方。 - ddavison

2
您可以将以下代码插入到spec_helper.rb中,并使一些数据实例化(在本例中为yaml文件中的“产品”):
您可以将以下代码插入到spec_helper.rb中,并使一些数据实例化(在本例中为yaml文件中的“产品”):
seeds_file = File.join(Rails.root, 'db', 'seeds.yml')
config = YAML::load_file(seeds_file)
config["products"].each do |product|
  FactoryGirl.create(:product, product) if !Product.find_by_name(product['name'])    
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接