Ruby on 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

我试图填充我的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测试数据库中是否应该没有任何测试数据(仅结构)?是否所有东西都应该使用固定装置来代替?

根据我的经验,最好不要依赖于运行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)}',在我的测试数据库中实际上似乎没有创建任何内容