【问题标题】:SQLite3::SQLException when using database_cleaner with Rails / Spork / RSpec使用带有 Rails / Spork / RSpec 的 database_cleaner 时出现 SQLite3::SQLException
【发布时间】:2012-08-26 14:23:23
【问题描述】:

尝试在 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

【问题讨论】:

标签: ruby-on-rails sqlite rspec spork


【解决方案1】:

接受的答案会在每个测试之后截断,从而使所有测试变慢(当不需要时)。

只需添加

config.use_transactional_fixtures = false

使用 database_cleaner 时。

如果您同时拥有config.use_transactional_fixtures = trueDatabaseCleaner.strategy = :transaction,您将在另一个事务中启动一个事务,这是不允许的。

【讨论】:

  • 我有一段时间没有遇到这个问题了。我想我可能已经尝试过了。忘记是哪个项目了,无法重新测试=\
  • @Dan 我认为这可能已经发生了,但我回答是为了给未来的读者留个记录。
【解决方案2】:

我找到了将整个策略更改为: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

【讨论】:

    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2013-10-05
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多