2

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

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

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

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

4

1 回答 1

3

如果您的应用程序永远不会更改数据库对象,并且在生产和开发数据库以及测试数据库中是相同的,那么正确的做法是让它们成为种子。在 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(但请注意,固定装置通常不是一个好主意,因为它们会使您的测试更难阅读和鼓励你围绕现有的fixture编写测试,这会导致纠缠不清。测试的清晰度和健壮性比速度更重要。)

如果您正在使用 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 )但是,我不知道如何告诉数据库清理器删除给定类的某些实例而不是其他实例。

于 2014-06-11T18:21:19.737 回答