Rspec Rails中的TX不应具有的任何原因都需要\u new:true

Rspec Rails中的TX不应具有的任何原因都需要\u new:true,rspec,ruby-on-rails-4,database-cleaner,Rspec,Ruby On Rails 4,Database Cleaner,关于这个问题: 是否有任何地方不希望启动新的TX?(哪一个不起作用) 如果是这样,这应该是默认值 顺便说一句,这就是使用默认事务策略时,当代码的正常执行路径成功时,具有回滚的rspec测试将失败的原因 这是我的DatabaseCleaner设置。运行轨道4 RSpec.configure do |config| config.add_setting(:seed_tables) config.seed_tables = %w(global_options shoot_types) c

关于这个问题:

是否有任何地方不希望启动新的TX?(哪一个不起作用)

如果是这样,这应该是默认值

顺便说一句,这就是使用默认事务策略时,当代码的正常执行路径成功时,具有回滚的rspec测试将失败的原因

这是我的DatabaseCleaner设置。运行轨道4

RSpec.configure do |config|
  config.add_setting(:seed_tables)
  config.seed_tables = %w(global_options shoot_types)

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation, except: config.seed_tables)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation, {except: config.seed_tables}
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end
为了获得嵌套事务的回滚,您可以通过传递requires_new:true请求一个真正的子事务。如果出现任何错误,数据库将回滚到子事务的开头,而不回滚父事务。如果我们将其添加到前面的示例中:

大多数数据库不支持真正的嵌套事务。在撰写本文时,我们知道的唯一支持真正嵌套事务的数据库是MS-SQL。因此,Active Record通过在MySQL和PostgreSQL上使用保存点来模拟嵌套事务。有关保存点的更多信息,请参见dev.mysql.com/doc/refman/5.6/en/savepoint.html


谢谢您的回复。我的问题更多的是关于“为什么这不是默认值?”似乎如果你嵌套TX,那么这就是你想要的。我感觉这不是一个直接的默认值,因为它可能会导致某些情况下的意外行为。我想知道启用它只是为了让测试正常工作是否是一个坏主意?
RSpec.configure do |config|
  config.add_setting(:seed_tables)
  config.seed_tables = %w(global_options shoot_types)

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation, except: config.seed_tables)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation, {except: config.seed_tables}
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end