Vous pouvez également simuler une troncature en combinant la suppression de tous les enregistrements et la réinitialisation du compteur d'incrémentation automatique. Tout d'abord, vous devez créer une nouvelle classe d'opérations de base de données qui gérera la réinitialisation de la valeur d'incrémentation automatique de la table.
/**
* Resets all AUTO_INCREMENT counters on all tables in a dataset.
* @see PHPUnit_Extensions_Database_Operation_IDatabaseOperation
*/
class ResetAutoincrementOperation implements PHPUnit_Extensions_Database_Operation_IDatabaseOperation
{
/*
* @see PHPUnit_Extensions_Database_Operation_IDatabaseOperation::execute()
*/
public function execute(PHPUnit_Extensions_Database_DB_IDatabaseConnection $connection,
PHPUnit_Extensions_Database_DataSet_IDataSet $dataSet)
{
foreach ($dataSet->getReverseIterator() as $table) {
$query = "ALTER TABLE {$connection->quoteSchemaObject($table->getTableMetaData()->getTableName())}"
. " AUTO_INCREMENT = 1
";
try {
$connection->getConnection()->query($query);
} catch (PDOException $e) {
throw new PHPUnit_Extensions_Database_Operation_Exception('RESET_AUTOINCREMENT',
$query, array(), $table, $e->getMessage());
}
}
}
}
, écrasez maintenant les méthodes getSetUpOperation()
et getTearDownOperation()
comme décrit ci-dessus.
class FooTest extends PHPUnit_Extensions_Database_TestCase
{
/**
* @see PHPUnit_Extensions_Database_TestCase::getTearDownOperation()
*/
protected function getTearDownOperation()
{
// Clean up after ourselves
return new PHPUnit_Extensions_Database_Operation_Composite(array(
PHPUnit_Extensions_Database_Operation_Factory::DELETE_ALL(), // 1. delete all records from table
new ResetAutoincrementOperation() // 2. reset auto increment value
));
}
/**
* @see PHPUnit_Extensions_Database_TestCase::getSetUpOperation()
*/
protected function getSetUpOperation()
{
return new PHPUnit_Extensions_Database_Operation_Composite(array(
PHPUnit_Extensions_Database_Operation_Factory::DELETE_ALL(), // 1. delete all records from table
new ResetAutoincrementOperation(), // 2. reset auto increment value
PHPUnit_Extensions_Database_Operation_Factory::INSERT() // 3. insert new records
));
}
}
travaillé pour moi avec MySQL 5.5.24 et 3.6.10 PHPUnit
Cela se produit même lorsque la table faisant référence à la table que vous tronquer est vide. Assez sûr que c'est un bug MySQL, indépendamment des commentaires ici: http://bugs.mysql.com/bug.php?id=54678 La solution @Tower est malheureusement la seule option. – jmc