【问题标题】:RSpec & Database Cleaner - Keep certain objects permanently in the test databaseRSpec & Database Cleaner - 将某些对象永久保存在测试数据库中
【发布时间】:2014-06-11 12:27:38
【问题描述】:

我(迟来的)开始使用 RSpec/capybara 测试我的 Rails 应用程序(一个购物网站),使用 database cleaner 清除数据库并使用 Factory Girl 为每次测试生成新对象(就像大多数人一样)。这很好用,我认为在测试之间清除数据是个好主意。

但是,生成同一对象的多个实例可能会变得很慢并且(据我所知)有点乏味。在我的数据库中有一些对象总是相同的,或者我总是会生成一个相同的副本进行测试。例如,我的 Package 模型,它定义了订阅包的定价和功能限制。它可能永远不会改变。

有没有办法,通过这种配置(如果您需要更多信息,请评论并指定),将某些对象实例放入测试数据库并排除它们从数据库清理器或任何其他如何在测试数据库中永久保存特定对象的副本?

这主要是为了提高测试速度。

【问题讨论】:

    标签: ruby-on-rails rspec capybara factory-bot database-cleaner


    【解决方案1】:

    如果您的应用程序永远不会更改数据库对象,并且在生产和开发数据库以及测试数据库中都是相同的,那么正确的做法是让它们成为种子。在 db/seeds.rb 中创建它们。更多关于种子的信息:http://guides.rubyonrails.org/active_record_migrations.html#migrations-and-seed-data

    如果您所说的对象只属于您的测试数据库,您可以将它们设为 Rails 固定装置。更多关于固定装置的信息:http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures(但请注意,固定装置通常不是一个好主意,因为它们会使您的测试更难阅读,并鼓励您围绕现有固定装置编写测试,这会导致纠缠不清。测试清晰性和鲁棒性比速度更重要。)

    如果您使用 Database Cleaner 的截断或删除策略(可能是因为您在 Capybara 中使用支持 Javascript 的驱动程序),并且您已使用上述任一方法在测试之间将数据保留在测试数据库中,你可以告诉数据库清理器不要清空特定的表:

    DatabaseCleaner.strategy = :truncation, {:only => %w[widgets dogs some_other_table]}
    

    DatabaseCleaner.strategy = :truncation, {:except => %w[widgets]}
    

    (来源:https://github.com/bmabey/database_cleaner#how-to-use)但是,我不知道有什么方法可以告诉 Database Cleaner 删除给定类的某些实例而不是其他实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 2012-10-14
      • 1970-01-01
      • 2022-11-24
      • 2022-01-11
      • 2016-11-09
      相关资源
      最近更新 更多