【发布时间】:2018-09-03 13:38:43
【问题描述】:
我正在构建一个 Rails 应用程序(我是新手,如果有些措辞很笨拙,请原谅我)。我正在尝试编写从数据库中提取和使用数据的测试(使用 RSpec),但我无法以简洁的方式编写测试。
一些测试(例如注册用户或创建内容)似乎最适合拥有一个新的数据库,而有些则需要一个数据库填充的固定装置。
目前我正在使用数据库清理器 gem,配置如下:
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
DatabaseCleaner.strategy = :truncation end
# start the transaction strategy as examples are run
config.around(:each) do |example|
DatabaseCleaner.cleaning do
example.run
end
end
我对这两种策略都使用truncation 的原因是我更喜欢在示例之间完全刷新id 值(这样如果我在一个测试中create,然后在第二个测试中create ,第二个例子应该有 id 1 而不是 2)。我不确定各种策略的确切含义 - 我发现 this question 似乎用 SQL 语法来解释它们,但我对 那 不是很熟悉,所以我的理解仍然相当模糊的。我相信数据库是
使用 PostgreSQL 管理,但我很少需要通过它直接与它进行交互,所以我不是特别有经验。
所以我的数据库在每个示例之间完全删除并从头开始构建 - 如果我想要一个干净的数据库,那么这是理想的,但如果我想简单地加载固定装置,那么创建所有模型可能需要一段时间。感觉我应该能够拥有一个“缓存”版本的装置,我可以为那些适合的示例加载它。但我不知道该怎么做,如果可能的话。有什么办法吗?
编辑: 在 cmets 中进行讨论后,我怀疑我可能想要删除 Database Cleaner 并改用默认的 Rails 固定装置。我已经尝试过了,我遇到的唯一问题与上面描述的transaction 策略相同。也就是说:当测试创建的记录回滚时,id 不会回滚,这是一种尴尬的行为。如果我创建一个user 用于运行测试,那么将它称为User.find(1) 会很方便,如果id 不重置,这是不可能的。
这可能是某种危险信号,我不应该这样做(我愿意做其他事情)。我也意识到我可以说User.first 来获得相同的行为,这可能会更好。我不确定什么是合适的。
【问题讨论】:
标签: ruby-on-rails postgresql rspec-rails database-cleaner