在导轨控制台中加载和使用夹具

时间:2011-08-12 17:42:02

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

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

如果这不是一个好办法,请说出来。我是Rails的新手所以我在这里学习:)

6 个答案:

答案 0 :(得分:41)

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

rake db:fixtures:load RAILS_ENV=test
rails c test

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

user = User.find_by_name("John")

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

john = User.find_by_name("John")

所以现在你可以在控制台加载后开始引用变量'john'。顺便提一下,我链接的帖子显示了如何设置全局.railsrc文件,但你可以设置它,以便你有一个每个项目.railsrc。或者,如果你想要的东西不那么花哨,但很容易做...只需在你的项目中创建一个ruby文件(也许是'shortcuts.rb')。加载控制台后,只需执行一个require'快捷方式'。

答案 1 :(得分:30)

可能会迟到...... Rails 4

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

答案 2 :(得分:13)

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

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

答案 3 :(得分:6)

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

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来填充夹具YAML文件。

答案 4 :(得分:3)

可以使用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

答案 5 :(得分:3)

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

require 'active_record/fixtures'

ActiveRecord::Fixtures.create_fixtures FIXTURE_PATH_HERE, MODEL_NAME_HERE