【问题标题】:Working with test database in rails在 Rails 中使用测试数据库
【发布时间】:2013-01-14 01:45:23
【问题描述】:

我正在尝试填充我的 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 来代替所有东西?

【问题讨论】:

    标签: ruby-on-rails testing rspec tdd


    【解决方案1】:

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

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

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

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

    希望有帮助!

    【讨论】:

      【解决方案2】:

      但我想知道我是否错误地处理了这个问题?我不应该 我的 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 与工厂合作的基础知识

      【讨论】:

      • 也感谢您的反馈 - 我会调查 database_cleaner。
      • 没问题,乐于助人!如果您有兴趣阅读更多相关信息,Rails 测试规定 (amazon.com/Rails-Test-Prescriptions-Pragmatic-Programmers/dp/…) 涵盖了工厂,以及对测试 Rails 应用程序的相当好的概述。
      • 太棒了——一直在寻找类似的东西。还享受 RSPEC Peepcode 系列。后续问题 - 我应该看到我的 FactoryGirl 对象的结果出现在我的测试数据库中吗?例如,如果我运行 'let(:user) { FactoryGirl.create(:user) }',我的测试数据库中实际上似乎没有创建任何内容。
      • 是的,create 您应该会在数据库中看到一条记录。只是为了确保,尝试将 create 移出 let 块并进入实际测试,然后检查数据库。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      相关资源
      最近更新 更多