7

database_cleaner のGitHub ページの例に従おうとすると、RSpec から次のエラーが発生しました。

 ActiveRecord::StatementInvalid:
   SQLite3::SQLException: cannot start a transaction within a transaction: begin transaction

spec_helper.rb で使用される構成は次のとおりです。

require 'spork'
require 'database_cleaner'

Spork.prefork do
 # .. snip
  RSpec.configure do |config|
   # .. snip
    config.before(:suite) do
      DatabaseCleaner.strategy = :transaction
      DatabaseCleaner.clean_with(:truncation)
    end

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

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

Spork.each_run do

end
4

2 に答える 2

9

受け入れられた答えは、各テストの後に切り捨てることにより、すべてのテストを(必要がない場合に)遅くします。

追加するだけ

config.use_transactional_fixtures = false

database_cleaner を使用する場合。

両方がconfig.use_transactional_fixtures = trueあり、DatabaseCleaner.strategy = :transaction別のトランザクション内でトランザクションを開始する場合、それは許可されていません。

于 2013-06-03T20:44:15.250 に答える
6

解決策は、戦略全体を に変更することであることがわかりました:truncation。更新された spec_helper:

require 'spork'
require 'database_cleaner'

Spork.prefork do

  RSpec.configure do |config|
    config.use_transactional_fixtures = false

    config.before(:suite) do
      DatabaseCleaner.strategy = :truncation
    end

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

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

  end
end

Spork.each_run do

end
于 2012-08-31T18:39:40.243 に答える