3

この質問に関連:カスタム トランザクションは、rspec の database_cleaner では機能しません

requires_new で TX を開始したくない場所はありますか? (ネストされたTXを行います)

ModelObject.transaction(requires_new: true)

もしそうなら、これがデフォルトだったはずです。

ところで、これが、デフォルトのトランザクション戦略を使用している場合、コードの通常の実行パスが成功したときに、ロールバックを伴う rspec テストが失敗する理由です。

これが私の DatabaseCleaner セットアップです。Rails 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
4

1 に答える 1

2

ネストされたトランザクションの ROLLBACK を取得するには、requires_new: true を渡すことで実際のサブトランザクションを要求できます。何か問題が発生した場合、データベースは親トランザクションをロールバックせずに、サブトランザクションの先頭にロールバックします。前の例に追加すると、次のようになります。

ほとんどのデータベースは、真のネストされたトランザクションをサポートしていません。これを書いている時点で、真のネストされたトランザクションをサポートしていると認識している唯一のデータベースは MS-SQL です。このため、Active Record は MySQL と PostgreSQL のセーブポイントを使用してネストされたトランザクションをエミュレートします。セーブポイントの詳細については、dev.mysql.com/doc/refman/5.6/en/savepoint.html を参照してください。

http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html

于 2013-12-05T20:31:37.587 に答える