2012-08-31 11 views
7

mit database_cleaner Beim Versuch Beispiel auf database_cleaner der GitHub page zu folgen, stieß ich auf den folgenden Fehler von RSpec:SQLite3 :: SQLException, wenn sie mit Rails/Spork/RSpec

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

Die Konfiguration in spec_helper.rb verwendet wird:

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 
+0

Ich bekomme den gleichen Fehler beim Erstellen eines Datensatzes, können Sie helfen? http://stackoverflow.com/questions/14367396/sql-error-cannot-start-a-transaction-within-a-transaction-which-testing-with-cuc – pahnin

Antwort

6

Ich fand die Lösung, um die gesamte Strategie auf :truncation zu ändern. Aktualisierter spec_helper:

+0

ausgezeichnet - vielen Dank für die Hilfe! – bonhoffer

9

Die akzeptierte Antwort macht alle Tests langsamer (wenn sie nicht benötigt werden), indem sie nach jedem abgeschnitten werden.

Fügen Sie einfach

config.use_transactional_fixtures = false 

wenn database_cleaner verwenden.

Wenn Sie beide config.use_transactional_fixtures = true und DatabaseCleaner.strategy = :transaction haben, werden Sie eine Transaktion innerhalb einer anderen Transaktion starten, und das ist nicht erlaubt.

+0

Schon eine Weile her, seit ich dieses Problem hatte. Ich denke, dass ich das vielleicht versucht habe. Vergiss welches Projekt, also kann ich nicht nochmal testen = \ – Dan

+0

@Dan dachte ich, dass das vielleicht passiert ist, aber ich antwortete, um einen Rekord für zukünftige Leser zu halten. –