我正在使用rspec来测试我的rails 3 app。我需要在测试开始之前播种数据库。如何使用以下内容为数据库设定种子:
/db/seeds.rb
["Admin", "Member"].each do |role_name|
Role.find_or_create_by_name(role_name)
end
由于
答案 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 :each
或before :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