【问题标题】:Load and use fixture in rails console在 Rails 控制台中加载和使用夹具
【发布时间】:2011-10-26 00:37:20
【问题描述】:

我想知道是否有办法在 Rails 控制台中加载和/或使用夹具。实际上,我想从我的夹具 users.yml 创建一个用户来做一些测试,而不必经历每次做 User.new(:name = "John", :email = "..") 的所有“痛苦”。
我目前在测试环境中(rails c RAILS_ENV=test)。

如果这不是一个好的做事方式,请说出来。我是 Rails 新手,所以我来这里学习 :)

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 fixtures irb


    【解决方案1】:

    您应该能够在进入控制台之前加载您的灯具。像这样:

    RAILS_ENV=test bin/rails db:fixtures:load
    RAILS_ENV=test bin/rails console
    

    但是,您仍然无法像在测试中那样访问您的夹具数据。这只是将您的测试数据库与您的夹具数据一起加载。所以你仍然需要做类似的事情:

    user = User.find_by(name: "John")
    

    但是,您仍然可以为此类事情创建快捷方式。您可以将任何您想要的 ruby​​ 代码添加到 ~/.irbrc。我建议按照here 的描述创建一个 .railsrc 文件。然后,您可以设置以下内容:

    john = User.find_by(name: "John")
    

    所以现在您可以在控制台加载后开始引用变量“john”。顺便说一句,我链接到的帖子显示了如何设置全局 .railsrc 文件,但您可以设置它以便每个项目都有一个 .railsrc。或者,如果您想要一些不那么花哨但容易做的事情......只需在您的项目中创建一个 ruby​​ 文件(可能是“shortcuts.rb”)。加载控制台后,只需执行 require 'shortcuts'。

    【讨论】:

    • 感谢您的回答 - 但是(至少在 Rails 3.2.5 中)命令是:rails c test
    • 从 Rails 6.0 开始,rails c test 似乎不起作用。改为RAILS_ENV=test rails c
    • @MasaSakano LOL...回到我原来的答案?
    【解决方案2】:

    可能会迟到... 导轨 4

    require 'active_record/fixtures'
    ActiveRecord::FixtureSet.create_fixtures(Rails.root.join('test', 'fixtures'), 'users')
    

    【讨论】:

      【解决方案3】:

      您也可以将夹具加载到您的开发数据库中:

      $ rake db:fixtures:load
      $ rails c
      > require 'active_record/fixtures'
      > john = User.find ActiveRecord::FixtureSet.identify('john')
      

      【讨论】:

        【解决方案4】:

        所以我有类似但略有不同的需求。我想使用我现有的装置(来自我的 rspec 测试)来填充我的开发数据库。这就是我通过向我的 rake 文件(位于 libs/tasks/*.rake 中)添加一个新任务来做到这一点的方法:

        task d_populate: :environment do
          require 'active_record/fixtures'
          fixtures_dir = File.join(Rails.root, '/spec/fixtures') #change '/spec/fixtures' to match your fixtures location
          Dir.glob(File.join(fixtures_dir,'*.yml')).each do |file|
          base_name = File.basename(file, '.*')
          puts "Loading #{base_name}..."
          ActiveRecord::Fixtures.create_fixtures(fixtures_dir, base_name)
          end
        end
        

        如果您将其与 db:reset 结合使用,您也可以通过将其添加到您的 rake 任务来随意填充您的开发环境:

        task reseed: [:environment, 'db:reset', 'db:d_populate']
        

        然后你可以调用 rake db:reseed 从fixture YAML 文件中填充。

        【讨论】:

          【解决方案5】:

          您可以按如下方式在 Rails 3.2 控制台中加载夹具:

          require 'active_record/fixtures'
          
          ActiveRecord::Fixtures.create_fixtures FIXTURE_PATH_HERE, MODEL_NAME_HERE
          

          【讨论】:

            【解决方案6】:

            可以使用 FIXTURES_DIR 变量指定备用夹具目录。该值应该与测试/夹具相关。

            $ rake db:fixtures:load RAILS_ENV=test FIXTURES_DIR='../../spec/fixtures'
            

            也可以指定一组有限的灯具

            $ rake db:fixtures:load RAILS_ENV=test FIXTURES_DIR='../../spec/fixtures' FIXTURES=users,user_roles
            

            【讨论】:

            • hmm ... 这对我不起作用,但这确实有效:rake db:fixtures:load RAILS_ENV=test FIXTURES_PATH='spec/fixtures' FIXTURES=users,participants
            • 这是从 Rails 6 开始的最新方法。FIXTURES_DIR 可用于指定 test/fixtures 的子目录。 FIXTURES_PATH 可用于指定任何路径。
            猜你喜欢
            • 1970-01-01
            • 2021-07-24
            • 2012-01-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-08
            • 1970-01-01
            相关资源
            最近更新 更多