在Rails应用程序中,我需要在数据库中使用一个表来包含常量数据。
此表内容目前无意更改,但我不想将内容放在代码中,以便能够在需要时进行更改。
我尝试在创建它的迁移中填充此表,但这似乎不适用于测试环境并且会破坏我的单元测试。在测试环境中,我的模型永远不能在我的开发环境中返回任何值。
即使在测试环境中,有没有办法正确填充数据库?有没有其他方法可以处理这些不应该在代码中的数据?
修改
感谢所有人的回答,尤其感谢Vlad R解释问题。
我现在明白为什么我的数据没有加载到测试中。这是因为测试环境使用db:load
rake命令直接加载模式而不是运行迁移。仅将我的值放在迁移中而不是在模式中,不会加载这些值以进行测试。
答案 0 :(得分:3)
您可能观察到的是测试框架没有运行迁移(db:migrate),而是直接加载db / schema.rb(db:load)。
您有两种选择:
要涵盖使用db:load(而不是db:migrate - 例如test,使用更快的db:load而不是db:migrate等在新开发机器上启动新数据库)的场景,请创建一个RAILS_APP / lib / tasks中的drop-in rakefile通过将“seed”yml文件(每个模型一个)中的常量初始化数据加载到数据库中来扩充db:load任务。
使用db:seed rake任务作为示例。将种子数据放在db / seeds / .yml
中#the command is: rake:db:load
namespace :db do
desc 'Initialize data from YAML.'
task :load => :environment do
require 'active_record/fixtures'
Dir.glob(RAILS_ROOT + '/db/seeds/*.yml').each do |file|
Fixtures.create_fixtures('db/seeds', File.basename(file, '.*'))
end
end
end
要涵盖增量方案(db:migrate),请定义一个迁移,该迁移与上面定义的任务完全相同。
如果您的种子数据发生了变化,您将需要添加另一个迁移来删除旧的种子数据并加载新的种子数据,这在外键依赖性等情况下可能非常重要。
答案 1 :(得分:2)
查看我在loading seed data上的文章。
有很多方法可以做到这一点。我喜欢名为db:populate的rake任务,它允许您在正常的ActiveRecord创建语句中指定固定数据。为了将数据导入测试,我只是在test_helper中加载这个填充文件。但是,我想我将切换到已填充种子数据的测试数据库。
还有一个名为SeedFu的插件可以帮助解决这个问题。
无论你做什么,我建议不要使用灯具,因为它们不会验证您的数据,所以创建无效记录非常容易。