在rails中使用测试数据库

时间:2013-01-14 01:45:24

标签: 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
 end
然后我运行命令:

bundle exec rake db:populate
bundle exec rake db:test:prepare

第一个命令使用上面的rake任务重置并填充我的数据库,但第二个命令只重新创建我的数据结构并且不填充数据。

我这样做是为了让一些RSPec测试可以访问 - 但我想知道我是否正在接近这个错误?我的TDD测试数据库中是否应该没有任何测试数据(仅限结构)?是不是所有东西总是会用掉灯具?

2 个答案:

答案 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以及与工厂相关的基础知识

相关问题