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

AnA*_*ice 37 rspec ruby-on-rails ruby-on-rails-3

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

/db/seeds.rb

["Admin", "Member"].each do |role_name|
  Role.find_or_create_by_name(role_name)
end
Run Code Online (Sandbox Code Playgroud)

谢谢

Han*_*nes 157

在spec_helper.rb中:

RSpec.configure do |config|
  config.before(:suite) do
    Rails.application.load_seed # loading seeds
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 我需要在我的gemfile中明确地将'database_cleaner'gem添加到我的`:test`组以使DatabaseCleaner工作. (3认同)
  • 这对我很有用,现在我想知道为什么它没有得到更多的赞成或在其他地方出现 (3认同)
  • 这应该是接受的答案:( (3认同)

Mic*_*pko 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
Run Code Online (Sandbox Code Playgroud)

  • 这不应该在rails_helper而不是spec_helper吗? (3认同)

fea*_*ool 10

我一直在用rake自动加载来自db/seeds.rb的种子数据.顽固分子坚持认为你永远不应该为测试加载种子数据,但我采取更温和的立场,即你可能想要为特定测试加载种子数据,例如验证种子数据是否存在.

与此处给出的一些答案不同,我建议无条件地从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
Run Code Online (Sandbox Code Playgroud)

更新

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


Sco*_*ott 9

尝试,像这样的东西

rake db:seed RAILS_ENV=test
Run Code Online (Sandbox Code Playgroud)

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

rake -T
Run Code Online (Sandbox Code Playgroud)

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


Ahm*_*ain 8

要在 rspec 中加载种子,您​​需要在 spec_helper 的 confg.before(:suite) 中的数据库清理后添加它

config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
  load Rails.root.join('db', 'seeds.rb')
end
Run Code Online (Sandbox Code Playgroud)

  • +1 这样,它允许加载不同的种子文件进行测试(可能更小;) (2认同)