当试图在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
答案 0 :(得分:9)
接受的答案通过在每个测试之后截断来使所有测试变慢(当不需要时)。
添加
config.use_transactional_fixtures = false
使用database_cleaner时。
如果您同时拥有config.use_transactional_fixtures = true
和DatabaseCleaner.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