2016-11-24 2 views
1

Je suis en cours d'exécution des tests RSpec avec DatabaseCleaner sur les modèles Sequel suivantsRspec avec database_cleaner sur Sequel provoque une erreur de troncature clé étrangère

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 

quand je lance les essais, je reçois l'erreur suivante:

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`)) 

configuration Mon DatabaseCleaner est:

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

DatabaseCleaner devrait être Décharger pour Eigner les contraintes de clé avant de les tronquer, comme c'est le cas avec ActiveRecord, qui fonctionne bien.

Ma question est la suivante: est-ce un bogue de DatabaseCleaner-Sequel ou est-ce quelque chose à voir avec mon utilisation du plugin many_through_many de Sequel?

Répondre

1

Ok, ceci est un issue with DatabaseCleaner ouvert. La solution consiste à désactiver les contraintes de clé référentielle avant de les tronquer et de les réactiver par la suite.

Avec MySQL, il serait donc:

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