2

我正在尝试填充我的 rails Test 数据库并遇到问题。

我有一个脚本,我用它来休息、生成和填充我的开发数据库,​​它可以正常工作。基本上像

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 测试数据库中是否应该没有任何测试数据(仅结构)?一切都应该总是从 Fixtures 中运行吗?

4

2 回答 2

3

根据我的经验,不依赖于运行 rake 任务或使用任何其他外部进程来填充测试数据是一种很好的做法。您应该在测试本身中进行任何数据加载,并spec/support在必要时创建帮助程序以避免重复。

我见过各种加载测试数据的策略:自定义种子类放在 .fixture 中lib(尽管在某些情况下,fixture 可能很脆弱并且很痛苦),以及更重量级的解决方案,例如 factory_girl_rails 和facture gems,仅举几例很少。

至于db:test:prepare,根据 Rails 指南,它只是“检查待处理的迁移并加载测试模式”;没有加载实际数据。

http://guides.rubyonrails.org/testing.html#preparing-your-application-for-testing

希望有帮助!

于 2013-01-14T03:02:35.107 回答
1

但我想知道我是否错误地接近这个?我的 TDD 测试数据库中是否应该没有任何测试数据(仅结构)?一切都应该总是从 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与工厂合作的基础知识

于 2013-01-14T03:08:18.113 回答