Można również symulować obcięcie za pomocą kombinacji usuwania wszystkich rekordów, a następnie ponownie ustawić licznik automatycznych inkrementów.
Najpierw należy utworzyć nową klasę operacji bazy danych, która będzie obsługiwać resetowanie wartości auto-inkrementacji tabeli.
/**
* 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());
}
}
}
}
teraz zastąpić metody getSetUpOperation()
i getTearDownOperation()
jak opisano powyżej.
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
));
}
}
pracował dla mnie z MySQL 5.5.24 i 3.6.10 PHPUnit
Dzieje się tak nawet wtedy, gdy tabela przedstawieniu tabeli jesteś obcinania jest pusty. Na pewno jest to błąd MySQL, niezależnie od komentarzy: http://bugs.mysql.com/bug.php?id=54678 @Tower Solution to niestety jedyna opcja. – jmc