单元测试时 ActiveRecord 数据丢失 Rails + Node.js
ActiveRecord data loss when unit testing Rails + Node.js
背景: 我正在对基于 rails 4.1.1 和单独的套接字构建的游戏服务器进行单元测试。io/node.js 用于套接字消息传递.从 node.js 到 rails 的消息正在通过 RESTful http 请求。
单个测试用例运行如下:
(1) rake unit test --> (2) rails controller --> (3) node.js/socket.io --> (4) rails controller
问题描述:一些数据库条目是在步骤(2)用ActiveRecord创建的,然后在[=]接收到套接字消息21=]步骤 (3) node.js 将 HTTP 请求发送回 rails 控制器,最后 (!!) 在 步骤 (4) rails 控制器尝试从 步骤 (2) 访问数据库条目,但此时 TEST DB 内容为空。
问题: 清理 TEST DB 的 rake 似乎是理想的行为,但是我如何在测试用例中保留 TEST db 并防止此类问题?
提前致谢
您应该在测试中准备并向节点应用程序发送请求,并在那里断言响应。
但这不是一个好的做法。更好的解决方案是 HTTP 模拟(如 webmock gem)。这种方法将来会节省很多时间。
幸运的是,我找到了解决办法。
默认情况下,rake 将所有测试包装在单独的数据库事务中并在清理时回滚。此外,任何来自 TestCase 之外的 requests/queries 都不包含在事务中,并且在测试用例中不可见。
为避免此类行为,我们必须在 test/test_helper.rb
中禁用事务固定装置
class ActiveSupport::TestCase
self.use_transactional_fixtures = false
end
不利的是,我们必须手动清理测试数据库。所以@Alexander Shlenchack 指出首先要避免这种做法,并在将来使用 http/socket 模拟。
- 这里是简要总结http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/
- 及相关问题Rails minitest, database cleaner how to turn use_transactional_fixtures = false
背景: 我正在对基于 rails 4.1.1 和单独的套接字构建的游戏服务器进行单元测试。io/node.js 用于套接字消息传递.从 node.js 到 rails 的消息正在通过 RESTful http 请求。 单个测试用例运行如下:
(1) rake unit test --> (2) rails controller --> (3) node.js/socket.io --> (4) rails controller
问题描述:一些数据库条目是在步骤(2)用ActiveRecord创建的,然后在[=]接收到套接字消息21=]步骤 (3) node.js 将 HTTP 请求发送回 rails 控制器,最后 (!!) 在 步骤 (4) rails 控制器尝试从 步骤 (2) 访问数据库条目,但此时 TEST DB 内容为空。
问题: 清理 TEST DB 的 rake 似乎是理想的行为,但是我如何在测试用例中保留 TEST db 并防止此类问题?
提前致谢
您应该在测试中准备并向节点应用程序发送请求,并在那里断言响应。
但这不是一个好的做法。更好的解决方案是 HTTP 模拟(如 webmock gem)。这种方法将来会节省很多时间。
幸运的是,我找到了解决办法。
默认情况下,rake 将所有测试包装在单独的数据库事务中并在清理时回滚。此外,任何来自 TestCase 之外的 requests/queries 都不包含在事务中,并且在测试用例中不可见。
为避免此类行为,我们必须在 test/test_helper.rb
中禁用事务固定装置class ActiveSupport::TestCase
self.use_transactional_fixtures = false
end
不利的是,我们必须手动清理测试数据库。所以@Alexander Shlenchack 指出首先要避免这种做法,并在将来使用 http/socket 模拟。
- 这里是简要总结http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/
- 及相关问题Rails minitest, database cleaner how to turn use_transactional_fixtures = false