可以依靠Rspec回滚事务吗?

可以依靠Rspec回滚事务吗?,rspec,rspec-rails,Rspec,Rspec Rails,今天早些时候,我开始遇到一个奇怪的RSpec问题,大约5%的测试都没有通过。主要的共同点是,大多数失败都与测试计算类内实例总数的情况有关,例如expectObject.count。错误类型如下所示: 预期:2 得到:10 我想深入了解单个测试的细节,看看发生了什么。我发现每次运行测试时,即使我注释掉了测试的每个部分,特定对象的实例数也会增加一个。这就像每次运行测试时,测试数据库都在无缘无故地实例化一个对象。我检查了我的rspec配置,以确保事务装置设置为true。我一直在寻找一个问题的答案,为什

今天早些时候,我开始遇到一个奇怪的RSpec问题,大约5%的测试都没有通过。主要的共同点是,大多数失败都与测试计算类内实例总数的情况有关,例如expectObject.count。错误类型如下所示:

预期:2 得到:10

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

DatabaseCleaner.strategy=:截断 DatabaseCleaner.clean


就在我测试之前,但这似乎是一个笨拙的解决方案,因为有人说它会减慢测试套件的速度。如果这不是问题的根源,那么在我的测试套件中创建一系列包含数据库清理器的before操作,我会有些犹豫。我以前遇到过这个问题的变体,例如测试数据库未清除。一般认为Rspec不能在每次测试执行后一致地回滚事务吗?

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

下面是一个简化的代码示例,该代码导致每次运行规范时对象的实例数都会增加:

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

这是一个主观的问题。。。但很明显,在你的特定情况下,它并没有倒退。您是否正在寻求帮助,解释为什么它不适用于您的测试?如果是,请发布测试代码。