我正在尝试填充我的rails测试数据库并遇到问题。
我有一个脚本,我用来休息,生成和填充我的开发数据库,它可以正常工作。基本上像
namespace :db do
desc "Fill database with sample data"
task populate: :environment do
Rake::Task['db:reset'].invoke
--Create all my dummy data here---
end
end
end
然后我运行命令:
bundle exec rake db:populate
bundle exec rake db:test:prepare
第一个命令使用上面的rake任务重置并填充我的数据库,但第二个命令只重新创建我的数据结构并且不填充数据。
我这样做是为了让一些RSPec测试可以访问 - 但我想知道我是否正在接近这个错误?我的TDD测试数据库中是否应该没有任何测试数据(仅限结构)?是不是所有东西总是会用掉灯具?
答案 0 :(得分:3)
根据我的经验,不依赖于运行rake任务或使用任何其他外部流程来填写测试数据是一种很好的做法。您应该在测试中自己进行任何数据加载,并在spec/support
中创建帮助,以避免在必要时进行重复。
我已经看到了加载测试数据的各种策略:放置在lib
中的自定义种子类,固定装置(虽然固定装置可能很脆弱,在某些情况下会很痛苦),以及更重量级的解决方案,例如factory_girl_rails和制作宝石,仅举几例。
至于db:test:prepare
,根据Rails指南,它只是"检查挂起的迁移并加载测试模式&#34 ;;没有加载实际数据。
http://guides.rubyonrails.org/testing.html#preparing-your-application-for-testing
希望有所帮助!
答案 1 :(得分:1)
但我想知道我是否接近这个错误?我不应该 在我的TDD测试数据库中有任何测试数据(只有结构)? 是不是所有东西总是会用掉灯具?
通常,是的,您的测试数据库应该是空的 - 如果您的测试数据库已填充,并且未在测试之间进行清理,则可以根据测试运行的顺序打开自己的测试结果。
您可以使用任何一种灯具,或者更常见的是,工厂可以在运行前为每个测试填充数据。 Fixtures将从您的fixtures文件中填充整个数据库,因此对于每个测试,您将填充大量不必要的数据。对于工厂,您可以指定要在测试中填充的数据(特定数据和相关记录由您的工厂定义处理)。
一些受欢迎的工厂是factory_girl:https://github.com/thoughtbot/factory_girl和机械师:https://github.com/notahat/machinist
你还需要像database_cleaner这样的东西:https://github.com/bmabey/database_cleaner - database_cleaner负责在每次测试之间擦除你的数据库,这样你就可以用干净的平板开始测试。
这里有一个railscast:http://railscasts.com/episodes/158-factories-not-fixtures以及与工厂相关的基础知识