【问题标题】:ActiveRecord data loss when unit testing Rails + Node.js单元测试 Rails + Node.js 时 ActiveRecord 数据丢失
【发布时间】:2016-03-22 13:20:49
【问题描述】:

背景:我正在对基于 rails 4.1.1 和用于套接字消息传递的单独 socket.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创建的,然后在步骤(3)收到套接字消息> node.js 将 HTTP 请求发送回 rails 控制器,最后(!!)在 步骤 (4) rails 控制器尝试从 步骤 (2) 访问 DB 条目,但是此时 TEST DB 内容为空。

问题:清理 TEST DB 似乎是 rake 的理想行为,但如何在测试用例中持久化 TEST db 并防止此类问题?

提前致谢

【问题讨论】:

    标签: ruby-on-rails node.js unit-testing activerecord rake


    【解决方案1】:

    您应该在测试中准备并向节点应用程序发送请求并在那里断言响应。

    但这不是一个好习惯。更好的解决方案是 HTTP 模拟(如 webmock gem)。这种方法将在未来节省大量时间。

    【讨论】:

    • 感谢您的快速回复。正如您所提到的,我正在向 rake 测试中的节点应用程序发送请求。但我无法从节点应用程序向模拟 http 发送回复,因此它会返回到正在运行的 rails 服务器。我认为此时数据丢失了
    • 使用模拟时不需要使用节点应用程序。请看一篇关于它的好文章:asquera.de/blog/2015-03-30/testing-external-apis-in-ruby
    【解决方案2】:

    幸运的是,我找到了解决方案。

    默认情况下,rake 将所有测试包装在单独的数据库事务中,并在清理时回滚。此外,来自 TestCase 之外的任何请求/查询都不包含在事务中,并且在测试用例中不可见。

    为避免此类行为,我们必须在 test/test_helper.rb

    中禁用事务性装置
    class ActiveSupport::TestCase
      self.use_transactional_fixtures = false
    end
    

    不利的一面是,我们必须手动清理测试数据库。所以@Alexander Shlenchack 指出首先要避免这种做法,并在将来使用 http/socket 模拟。

    【讨论】:

      猜你喜欢
      • 2014-03-13
      • 2020-05-16
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      相关资源
      最近更新 更多