【问题标题】:Can Rspec be relied upon to rollback transactions?可以依靠 Rspec 来回滚事务吗?
【发布时间】:2014-10-25 00:20:36
【问题描述】:

今天早些时候,我开始遇到一个奇怪的 RSpec 问题,其中大约 5% 的测试刚刚停止通过。主要的共同点是大多数失败都与测试计算类中实例总数的情况有关(例如,expect(Object.count))。错误的类型是这样的:

预计:2 得到:10

我想进一步深入了解单个测试的细节,看看发生了什么。我发现每次运行测试时,特定对象的实例数都会增加一(即使我注释掉了测试的每个部分)。就像测试数据库在每次运行测试时都实例化一个对象,没有明显的原因。我检查了我的 rspec 配置以确保事务性装置设置为 true。我一直在寻找为什么测试数据库数据似乎没有被清除的问题的答案,而且似乎普遍的共识是“只使用数据库清洁器”。话虽如此,我还是能够通过插入使测试最终通过

DatabaseCleaner.strategy = :truncation DatabaseCleaner.clean

就在我的测试之前,但这似乎是一个笨拙的解决方案,因为有些人说它会减慢测试套件的速度。如果这不是问题的根源,我有点犹豫是否要在我的测试套件中创建一堆包含 Database Cleaner 的之前操作。我之前遇到过这个问题的变体(例如,测试数据库没有清除)。一般的想法是否只是在每次测试执行后无法始终依赖 Rspec 来回滚事务?

【问题讨论】:

  • 这是一个主观问题......但显然它并没有在您的具体情况下回滚。您是否正在寻求帮助来解释为什么它对您的测试不起作用?如果是这样,请发布测试代码。

标签: rspec rspec-rails


【解决方案1】:

事实证明,这种情况下的问题与规范中的 Rspec 共享示例有关。显然,在一个共享示例中,it_behaves_like 块中的代码不会像规范中的其他测试那样进行事务回滚。

这是导致每次运行规范时 Object 实例数量增加的代码的简化示例:

  it_behaves_like "require_sign_in" do
    object = Fabricate(:object)
    let(:action) { delete :destroy, id:object.object_id }
  end

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 2016-01-10
    • 2011-09-09
    • 1970-01-01
    • 2018-01-20
    • 2020-05-06
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    相关资源
    最近更新 更多