2016-11-24 38 views
1

我正在與DatabaseCleaner RSpec的測試,以下續集車型Rspec的與database_cleaner在續集導致外鍵截斷誤差

class User < Sequel::Model 
     one_to_many :memberships 
     many_through_many :accounts, [[:memberships, :user_id, :account_id]] 
end 

class Account < Sequel::Model 
     one_to_many :memberships 
     many_through_many :users, [[:memberships, :user_id, :account_id]] 
end 

class Membership < Sequel::Model 
     many_to_one :account 
     many_to_one :user 
end 

當我運行測試,我得到以下錯誤:

An error occurred in a `before(:suite)` hook. 
Failure/Error: DatabaseCleaner.clean_with(:truncation) 

Sequel::DatabaseError: 
    Mysql2::Error: Cannot truncate a table referenced in a foreign key constraint (`account_users`.`memberships`, CONSTRAINT `memberships_ibfk_2` FOREIGN KEY (`account_id`) REFERENCES `account_users`.`accounts` (`id`)) 

我DatabaseCleaner設置是:

config.before(:suite) do 
    DatabaseCleaner.strategy = :transaction 
    DatabaseCleaner.clean_with(:truncation) 
    end 

DatabaseCleaner應取消設置在截斷之前設置關鍵限制,就像ActiveRecord那樣,它可以正常工作。

我的問題是:這是一個DatabaseCleaner-Sequel錯誤還是它與我的使用續集many_through_many插件?

回答

1

好的,這是一個開放的issue with DatabaseCleaner。解決方法是在截斷並在之後重新啓用它們之前禁用引用密鑰約束。

用MySQL,這將是這樣的:

DB.run('SET FOREIGN_KEY_CHECKS=0;') 
DatabaseCleaner.clean_with(:truncation) 
DB.run('SET FOREIGN_KEY_CHECKS=1;')