【问题标题】:How can I use FactoryBot in db/seeds?如何在 db/seeds 中使用 FactoryBot?
【发布时间】:2011-07-19 22:21:52
【问题描述】:

可以这样做吗?

如果是这样,你怎么做?

注意:FactoryBot 以前被命名为 FactoryGirl

【问题讨论】:

  • db/seeds.rb 应该包含您的站点需要运行的生产特定核心数据。工厂应该只在你的测试中使用,帮助你独立地执行操作。你只是想让你的数据库/种子更短还是什么?

标签: ruby-on-rails factory-bot seed


【解决方案1】:

您需要做的就是将require 'factory_bot_rails' 添加到db/seeds.rb 文件中。这将使您可以访问您的工厂。

注意:Gem 以前称为 FactoryGirlRails

【讨论】:

  • 这很好,但请确保 :require => false 在您的 gemfile 中用于 factory_girl_rails,否则当您尝试 db:migrate 并且工厂代表您尚未迁移的模型时,它会导致初始化依赖问题然而。 -- 然后你需要在你的 spec_helper 中要求 'factory_girl_rails'。
【解决方案2】:

Josh Clayton,FactoryGirl 的维护者,recommends against using FactoryGirl in your seeds file。他建议改用普通的 ActiveRecord。

【讨论】:

  • 希望在种子中使用 Factory Girl 的一个很好的理由是,每次有人更新 API 时,我们的 ActiveRecord 种子都会中断。它在没有警告的情况下中断。为了防止这种情况发生,我们希望测试覆盖种子文件。 Factory Girl 可以帮助播种和测试。
  • 我一直不太理解那篇文章。我猜他们指的是仅将其用于此目的。如果您已经有多个用于测试的工厂,并且您已经保持最新状态,那么重用它们而不是重写该逻辑是很有意义的。
【解决方案3】:

(此答案适用于 rails 3.0.7)

我发现问题在于你如何设置 Gemfile - 你需要按照以下方式做一些事情

gem 'factory_girl'

group :test do
  gem 'factory_girl_rails'
end

我们发现factory_girl_rails 存在于:test 环境之外的问题,我们未能深入了解(可能与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

【讨论】:

  • 查看 hubble 对 Michael 的回答的评论,了解使 Gemfile 工作的另一种方法。似乎 factory_girl_rails 在 db/seeds 中要求是安全的,但 Rails 不应该通过 Bundler 自动要求。为了防止这种情况发生,哈勃设置:require => false。
  • 很好的答案!正是我需要的。我发现如果我有两个 require 语句,我会得到错误。所以我的实现中没有它们。
  • 在 Rails 4 中,这不再是必需的:您可以使用 group :development, :test do gem 'factory_girl_rails' 然后只需要 lib/tasks/sample_data.rake 中的 'factory_girl_rails'。
【解决方案4】:

在 db/seeds.rb 中

require 'factory_girl_rails'

10.times do
  FactoryGirl.create :user
end

【讨论】:

  • FactoryGirl.create_list(:user, 10)
【解决方案5】:

您可以将以下代码插入到您的 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

【讨论】:

    【解决方案6】:

    在 Rails 5.2.6 中,您可以在 db/seeds.rb 文件中创建工厂。在 seeds.rb 文件的顶部添加 include FactoryBot::Syntax::Methods。在该行下方,您可以创建自己的工厂——即user1 = create(:user)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2019-12-23
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多