Ruby on rails 在rails中使用测试数据库
我试图填充我的rails测试数据库,但遇到了一些问题 我有一个脚本,我用它来休息、生成和填充我的开发数据库,它可以正常工作。基本上Ruby on rails 在rails中使用测试数据库,ruby-on-rails,testing,rspec,tdd,Ruby On Rails,Testing,Rspec,Tdd,我试图填充我的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
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测试数据库中是否应该没有任何测试数据(仅结构)?是否所有东西都应该使用固定装置来代替?根据我的经验,最好不要依赖于运行rake任务或使用任何其他外部进程来填充测试数据。您应该在测试本身中进行任何数据加载,并在
spec/support
中创建助手,以避免必要时的重复
我见过加载测试数据的各种策略:放置在lib
中的自定义种子类,fixture(尽管fixture在某些情况下可能很脆弱,很痛苦),以及更重的解决方案,例如factory_girl_rails和Manufacturing gems等等
至于db:test:prepare
,根据Rails指南,它只是“检查挂起的迁移并加载测试模式”;没有加载实际数据
希望有帮助 根据我的经验,最好不要依赖于运行rake任务或使用任何其他外部进程来填充测试数据。您应该在测试本身中进行任何数据加载,并在
spec/support
中创建助手,以避免必要时的重复
我见过加载测试数据的各种策略:放置在lib
中的自定义种子类,fixture(尽管fixture在某些情况下可能很脆弱,很痛苦),以及更重的解决方案,例如factory_girl_rails和Manufacturing gems等等
至于db:test:prepare
,根据Rails指南,它只是“检查挂起的迁移并加载测试模式”;没有加载实际数据
希望有帮助
但我想知道我是否处理得不对?我不应该吗
我的测试数据库中是否有TDD的测试数据(仅结构)?
所有东西都应该用固定装置代替吗
一般来说,是的,测试数据库应该是空的-如果在测试之间填充了测试数据库,而没有进行清理,那么根据测试运行的顺序,您可能会有不同的测试结果
您可以使用fixture,或者现在更常见的是使用factories在每个测试运行之前填充数据。Fixtures将从Fixtures文件填充整个数据库,因此对于每个测试,您将填充大量不必要的数据。对于工厂,您可以指定要在测试本身中填充的数据(特定数据和相关记录由工厂定义负责)
一些受欢迎的工厂是工厂女孩:和机械师:
您还需要类似database_cleaner的东西:-database_cleaner负责在每次测试之间擦除您的数据库,因此您可以从头开始测试
这里有一位铁路专家:具备与工厂合作的基本知识
但我想知道我是否处理得不对?我不应该吗
我的测试数据库中是否有TDD的测试数据(仅结构)?
所有东西都应该用固定装置代替吗
一般来说,是的,测试数据库应该是空的-如果在测试之间填充了测试数据库,而没有进行清理,那么根据测试运行的顺序,您可能会有不同的测试结果
您可以使用fixture,或者现在更常见的是使用factories在每个测试运行之前填充数据。Fixtures将从Fixtures文件填充整个数据库,因此对于每个测试,您将填充大量不必要的数据。对于工厂,您可以指定要在测试本身中填充的数据(特定数据和相关记录由工厂定义负责)
一些受欢迎的工厂是工厂女孩:和机械师:
您还需要类似database_cleaner的东西:-database_cleaner负责在每次测试之间擦除您的数据库,因此您可以从头开始测试
这里有一位railscast:了解与工厂打交道的基本知识也感谢您的反馈-我将查看数据库\u cleaner。没问题,很乐意提供帮助!如果您有兴趣阅读更多关于这方面的内容,Rails测试处方()涵盖了工厂,以及测试Rails应用程序的相当好的概述。还享受RSPEC Peepcode系列。后续问题-我应该看到FactoryGirl对象的结果出现在我的测试数据库中吗?例如,如果我运行'let(:user){FactoryGirl.create(:user)}',在我的测试数据库中实际上似乎没有创建任何内容。使用
create
可以看到数据库中的记录。为了确保这一点,请尝试将create移出让
块并进入实际测试,然后在测试结束后检查数据库。同样感谢您的反馈-我将查看数据库清理器。没问题,很乐意提供帮助!如果您有兴趣阅读更多关于这方面的内容,Rails测试处方()涵盖了工厂,以及测试Rails应用程序的相当好的概述。还享受RSPEC Peepcode系列。后续问题-我应该看到FactoryGirl对象的结果出现在我的测试数据库中吗?例如,如果我运行'let(:user){FactoryGirl.create(:user)}',在我的测试数据库中实际上似乎没有创建任何内容