2012-08-31 15 views
7

Gdy próbuje naśladować przykład na database_cleaner na GitHub page, I napotkał następujący błąd z RSpec:SQLite3 :: SQLException podczas korzystania database_cleaner z Rails/Spork/RSpec

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

konfiguracja jest stosowana w 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 
+0

Otrzymuję ten sam błąd podczas tworzenia rekordu, może możesz pomóc? http://stackoverflow.com/questions/14367396/sql-error-cannot-start-a-transaction-within-a-transaction-while-testing- with-cuc – pahnin

Odpowiedz

6

Znalazłem rozwiązanie, które zmienia całą strategię na :truncation. Zaktualizowano 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 
+0

excellent - dzięki za pomoc! – bonhoffer

9

Przyjęta odpowiedź powoduje spowolnienie wszystkich testów (gdy nie jest to konieczne) przez skrócenie po każdym z nich.

Wystarczy dodać

config.use_transactional_fixtures = false 

podczas korzystania database_cleaner.

Jeśli masz zarówno config.use_transactional_fixtures = true, jak i DatabaseCleaner.strategy = :transaction, rozpoczniesz transakcję wewnątrz innej transakcji, a to niedozwolone.

+0

Minęło trochę czasu, odkąd miałem ten problem. Myślę, że mogłem tego spróbować. Zapomnij o tym projekcie, więc nie mogę ponownie przetestować = \ – Dan

+0

@ Dan Myślałem, że to się mogło stać, ale odpowiedziałem, aby zachować rekord dla przyszłych czytelników. –