使用RSpec,如何在加载时为数据库设定种子?

时间:2011-05-14 18:43:32

标签: ruby-on-rails ruby-on-rails-3 rspec

我正在使用rspec来测试我的rails 3 app。我需要在测试开始之前播种数据库。如何使用以下内容为数据库设定种子:

/db/seeds.rb

["Admin", "Member"].each do |role_name|
  Role.find_or_create_by_name(role_name)
end

由于

6 个答案:

答案 0 :(得分:148)

在spec_helper.rb中:

RSpec.configure do |config|
  config.before(:suite) do
    Rails.application.load_seed # loading seeds
  end
end

答案 1 :(得分:22)

然而,Scott的解决方案肯定适合您,我相信解决您问题的更好方法是将代码负责在RSpec的配置块中播种您的测试数据库:

我使用SeedFu,在我的spec_helper中我有:

RSpec.configure do |config|

  # some other configuration code ...

  config.before(:suite) do
    # ...
    SeedFu.seed
    # ...
  end

  # some other configuration code ...

end

答案 2 :(得分:9)

我跟随Auto-load the seed data from db/seeds.rb with rake的激烈辩论。顽固分子坚持认为你永远不应该为测试加载种子数据,但我采取了更为温和的立场,即你可能想要为特定测试加载种子数据 ,例如验证种子数据是否存在。

与此处给出的一些答案不同,我建议无条件地从spec_helper文件中加载种子。相反,您可以使用before :eachbefore :all在需要种子的测试文件中加载种子,例如:

describe "db seed tests" do
  before(:each) do
    load "#{Rails.root}/db/seeds.rb" 
  end

  ...your test code here...
end

更新

正如@marzapower所指出的,如果你走这条路线,你的seeds.db文件应该在创建条目或使用find_or_create_by方法之前清除每个表。 (提示:前者更快,更可靠。)如果多次加载seeds.db文件,这将防止重复输入。

答案 3 :(得分:8)

尝试,像这样

rake db:seed RAILS_ENV=test

您可以获取所有执行rake命令的列表

rake -T

如果这是测试数据,您可能希望将其放入将在测试开始时加载的灯具中。

答案 4 :(得分:2)

要在rspec中加载种子,您​​需要在spec_helper

中的confg.before(:suite)中进行数据库清理后添加它
config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
  load Rails.root.join('db', 'seeds.rb')
end

答案 5 :(得分:1)

我最终需要使用DatabaseCleaner截断数据库,然后加载执行播种的rake任务(因为我使用seedbank)。之后,我在database_cleaner README之类的事务中完成了我的测试包装,这样每个测试都可以在新加载的网站上运行。

RSpec.configure do |config|
  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
    MyApplicationName::Application.load_tasks
    Rake::Task['db:seed'].invoke # loading seeds
  end
  config.around(:each) do |example|
    DatabaseCleaner.cleaning do
      example.run
    end
  end
end