【发布时间】:2013-08-13 02:00:57
【问题描述】:
我正在浏览 railstutorial.org 网站,但似乎在进行集成测试时遇到了问题。假设在表单发布后检查用户是否正确创建,但由于测试数据库没有回滚,后续测试失败,这会导致错误,因为验证用户不能拥有相同的电子邮件。任何解释为什么记录会持续存在?如果相关,有问题的代码来自this 列表。
【问题讨论】:
标签: ruby-on-rails-3
我正在浏览 railstutorial.org 网站,但似乎在进行集成测试时遇到了问题。假设在表单发布后检查用户是否正确创建,但由于测试数据库没有回滚,后续测试失败,这会导致错误,因为验证用户不能拥有相同的电子邮件。任何解释为什么记录会持续存在?如果相关,有问题的代码来自this 列表。
【问题讨论】:
标签: ruby-on-rails-3
注意:我是Rails Tutorial 的作者。在 Peter Cooper reported 之后添加了 config.cache_classes = false 行,表示有必要让 RSpec 和 Spork 在他的系统上协同工作。由于我认为没有必要,而且它似乎引入了很多问题(例如在这个线程中确定的问题),所以该行已被删除。如果你使用the latest version of the book,你应该不会遇到这个问题。
【讨论】:
考虑使用database_cleaner。您的规范助手将包含如下内容:
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with :truncation
end
config.before(:each) do
ActionMailer::Base.deliveries = []
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
config.after(:all) do
DatabaseCleaner.clean_with :truncation
end
【讨论】:
看来问题出在线路上
config.cache_classes = false
我已将此设置为 false 假设它会确保不使用陈旧的类数据,但它似乎在其他方面产生了相反的效果。将其更改为 true 可以解决我遇到的所有奇怪问题,但我仍然对为什么感到困惑。我认为这可能与操作系统有关,正如教程中所说,对于 OSX(我正在运行),将该行设置为 true 可以正常工作,而其他操作系统需要将其设置为 false
【讨论】:
虽然 Hartl 的教程给我的印象是完美无缺,但您在这里提出的问题也许可以归类为一个重要的遗漏。
这里是:RailsTutorial - chapter 8.4.3 - Test database not clearing after adding user in integration test
和
这里是:Rails 3 Tutorial Chapter 11 "Validation failed: Email has already been taken" error
和
这里是:config.cache_classes = false messing up rspec tests?
...都是同一个问题的变体。
Mike Hartl,如果你在场,你似乎离完美的 RoR 教程只有一个问题。
最好的问候,
佩里
【讨论】: