使用带有Rails / Spork / RSpec的database_cleaner时的SQLite3 :: SQLException

时间:2012-08-31 18:39:40

标签: ruby-on-rails sqlite rspec spork

当试图在database_cleaner的GitHub page上关注示例时,我在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

2 个答案:

答案 0 :(得分:9)

接受的答案通过在每个测试之后截断来使所有测试变慢(当不需要时)。

添加

config.use_transactional_fixtures = false

使用database_cleaner时。

如果您同时拥有config.use_transactional_fixtures = trueDatabaseCleaner.strategy = :transaction,那么您将在另一个交易中开始交易而且这是不允许的。

答案 1 :(得分: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