我该如何在Rails控制台中使用FactoryBot的工厂?

109

我正在开发环境中使用Rails控制台,想要使用工厂。我该如何访问它们?

我尝试了require "FactoryBot",但返回了错误信息。

1.9.3p393 :301 > require "FactoryBot"
LoadError: cannot load such file -- FactoryBot

一次A简单的Google搜索产生了几个结果。你尝试过这些吗?它们不起作用吗?你到目前为止尝试了什么? - wpp
2
这些都是测试用的,我想在开发环境中进行。 - Eric Baldwin
2
你可能想要从 require 'factory_girl' 开始,而不是要求 FactoryGirl 常量。 - Rob Dawson
1
调整到当前时间 - 您可以启动 rails c 然后执行 require 'factory_bot' - RudyOnRails
4个回答

244

我是这样做的:

  • 在沙盒模式下启动测试环境中的Rails控制台。

rails console -e test --sandbox

你需要这样做有两个原因:

  1. 您所做的任何更改都将被回滚。
  2. 如果您已经具有某些种子数据,那么工厂可能会从1开始序列化属性,但这些记录可能已经存在。

然后在控制台中:

  • 要求使用FactoryBot(之前称为FactoryGirl):

require 'factory_bot'
  • 加载工厂定义:

  • FactoryBot.find_definitions
    
  • 引入FactoryBot方法以避免在所有对FB的调用前加上前缀FactoryBot(使用create代替FactoryBot.create):

  • include FactoryBot::Syntax::Methods
    

    附注:对于fabrication gem,您可以使用以下命令在Rails console中加载定义:

    Fabrication.manager.load_definitions
    

    如果您使用它,还需要require 'faker'


    这取决于您使用哪个 gem - faker 还是 ffaker,但我同意最近 ffaker 更为广泛使用。 - Alexander Popov
    我曾经遇到过“undefined method fixture_file_upload”的问题,这是由于缺少“ActionDispatch::TestProcess”模块引起的,因此您可能需要考虑将其包含在内。 - divideByZero
    1
    如果您需要频繁重启控制台,这里有一个一行代码的解决方案:require "factory_bot_rails"; include FactoryBot::Syntax::Methods; require 'ffaker' - Mirror318
    1
    Rails 5.1.6,只需使用rails console testrails console test --sandbox即可。如果您不喜欢使用FactoryBot前缀,请包含语法方法。 - Francisco Quintero
    2
    对于Rails 6.0,可以像这样运行控制台:rails c -e test --sandbox - David Morales
    显示剩余2条评论

    45
    为了解决这个问题,请确保在你的Gemfile中指定了factory_bot gem,类似于以下内容。
    group :development, :test do
      gem 'factory_bot_rails'
    end
    

    然后执行 bundle install 命令。
    这样就可以在开发控制台中使用 FactoryBot 类了。
    希望这能帮到你。

    2
    将FactoryGirl添加到Gemfile中,像这样:gem 'factory_girl_rails',:require => false,会导致任何试图从头开始设置开发环境的人遇到错误,请注意。 - Epigene
    5
    这个回答可行,但被采纳的答案应该是 rails console test,它可以让你在测试环境中创建一个控制台,这样就不需要更新Gemfile来使用开发环境中的测试包。 - Dylan Pierce

    26

    您需要导入'factory_bot_rails',这是Rails实际使用的Gem。该Gem将包含Factory Bot库,从而可用FactoryBot

    您可以采取以下两种方法之一,要么执行此操作,要么像muttonlamb的答案那样在启动时更新您的Gemfile。


    因为我在我的工厂中使用Faker,所以我也必须运行“require 'faker'”。 - albertski

    14
    如果您希望每次启动控制台时都可用,可以将以下代码添加到config/environments/development.rb文件的顶部:
    require 'factory_bot_rails'
    require 'faker' # if you're also using faker gem
    require 'rails/console/helpers'
    Rails::ConsoleMethods.prepend(FactoryBot::Syntax::Methods)
    
    

    现在您可以在启动控制台后立即使用内置帮助程序,例如:

    company = create(:company)
    

    1
    对于Rails 6,这个答案是正确的 - 之前的答案都不起作用。我只需要运行Rails::ConsoleMethods.prepend(FactoryBot::Syntax::Methods)(而不是之前的三个require)就可以让它工作了(我不使用faker)。 - Ed Ruder
    2
    如果你在Gemfile的development组中有这些gem,那么你是正确的 - 它们应该自动被要求。 - Jacka

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