【问题标题】:Why is my test database empty before and after running rails test?为什么我的测试数据库在运行 rails test 前后都是空的?
【发布时间】:2012-01-06 06:45:26
【问题描述】:

尽管大多数人希望他们的数据库在运行单元/功能测试之间为空,但我正在调试一个问题,发现在运行测试之前和之后我的测试数据库为空很不方便,而且相当令人惊讶。即使我在 setup 和 teardown 中添加了一些东西来打印特定表的大小,它在 setup 时始终为 0,有时在 teardown 时大于 0。

这对我有什么用?我没有固定装置(我已经在 test_helper 中注释掉了默认的“固定装置:all”)并且我正在使用简单的单元/功能测试来扩展 ActiveSupport::TestCase(没有 RSpec 或类似的东西)。自生成 rails 项目以来,我没有添加太多/任何自定义配置/设置。

我正在运行 Rails 3.0.9 和 Ruby 1.8.7。

欢迎所有想法!

【问题讨论】:

  • 查看一些实际代码会很有帮助,而不仅仅是对代码的描述。

标签: ruby-on-rails database unit-testing


【解决方案1】:

您可以通过将use_transactional_fixtures 设置为false 来禁用此行为:

class MyTest < ActiveSupport::TestCase
  self.use_transactional_fixtures = false
end 

【讨论】:

  • 谢谢,就是这样。从快速的互联网搜索来看,这似乎是自 Rails 1.0 以来一直存在的。奇怪的是,我发现很多关于如何在运行之间删除数据的点击,如果它是默认的?...非常感谢您的解释。
【解决方案2】:

单元测试需要有已知的新鲜状态,这就是数据库被清除的原因。

使用 RSpec 防止测试数据库被擦除非常容易。不确定在 Rails 的内置 Test::Unit 内容的上下文中如何执行此操作,但如果这只是为了快速调试目的,您可能需要考虑的一件事是简单地使用记录器并跟踪测试日志:

Rails.logger.info "\n\nfoo 的值为 #{foo}\n\n"

这将放入 test.log 并在每一侧放置几个换行符,以便您在所有其他内容中轻松看到它。

希望对您有所帮助。

【讨论】:

  • 谢谢,不幸的是,我已经在调试打印语句,但仍然无法找出问题所在。似乎有一些数据库不一致,只有在我从自动测试运行测试时才会偶尔发生。通过“ruby -Itest ...”从命令行重复运行测试总是可以正常工作。我认为这与设置多次运行的父类有关。
  • 我又添加了一些打印语句(只是在不同的地方添加了“puts ...”),发现这确实是因为我有 class X
  • 在运行之间清除数据库一直是 Rails 的一部分,只要我一直在使用它(从 1.3x 开始)。听起来你也许可以重做你的课程设置并且仍然在做生意......? :-)
  • 确实,我修复了我的设置。我有点假设一个在另一个之前完成。我只需要一个反思,所以我删除了另一个。
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2012-07-30
  • 2015-04-03
  • 2017-09-08
  • 2023-03-30
  • 2021-12-28
相关资源
最近更新 更多