Тесты Symfony2: Проблема с креплениями и внешними ключами
Я разрабатываю проект с помощью Symfony и Doctrine, и у меня проблема с моими тестами. Я использую приспособления для загрузки данных для тестов, и некоторые из моих сущностей имеют связи между ними. В первый раз, когда я запускаю свои тесты с пустыми таблицами БД, тесты проходят безупречно. Но когда я снова запускаю тест, я получаю ошибку:
Исключение Doctrine\DBAL\Dbalexception: При выполнении "УДАЛИТЬ ИЗ Ent" произошло исключение:
Состояние SQLSTATE[23000]: Ограничение целостности нарушение: 1451 Не удается удалить или обновить родительскую строку: не удается выполнить ограничение внешнего ключа (
my_db
.Ent
, ОГРАНИЧЕНИЕFK_FE5D1D1E727ACA70
ССЫЛКИ НА ВНЕШНИЙ КЛЮЧ (parent_id
)Ent
(id
))
Причина ошибки очевидна: строка не может быть удалена, если другая строка ссылается на нее через внешний ключ.
Если я вручную урежу таблицу, сначала отключив ограничения внешнего ключа, и снова запущу тест с пустой таблицей, тесты снова будут успешными. Но я должен повторять это каждый раз Я провожу тесты.
Итак, вопрос в следующем: есть ли способ заставить Symfony или PHPUnit обрабатывать это автоматически?
Спасибо!
РЕДАКТИРОВАТЬ: Я забыл упомянуть, что я использую класс Liip\functionaltestbundle\Test\WebTestCase.
2 answers
В итоге я расширил WebTestCase, как предложил Nextar. Спасибо!
Это код:
<?php
namespace Acme\MyBundle\Tests\Controller;
use Liip\FunctionalTestBundle\Test\WebTestCase;
class MyWebTestCase extends WebTestCase {
protected function loadFixtures(array $classNames, $omName = null, $registryName = 'doctrine', $purgeMode = null) {
$this->getContainer()->get('doctrine')->getManager()->getConnection()->query(sprintf('SET FOREIGN_KEY_CHECKS=0'));
$result = parent::loadFixtures($classNames, $omName, $registryName, $purgeMode);
$this->getContainer()->get('doctrine')->getManager()->getConnection()->query(sprintf('SET FOREIGN_KEY_CHECKS=1'));
return $result;
}
}
Есть способ сделать это, вы должны написать свой собственный веб-тест, который расширяет тот, который предоставляется Symfony
Symfony\Bundle\FrameworkBundle\Test\WebTestCase
В методе загрузки вашего собственного веб-теста вы просто используете компонент command для:
- Удалите базу данных
- Создайте схему
- загрузите приспособления
Не забывай! Если вы выполняете команды, определите --env как тест! В противном случае вы удалите свою базу данных prod
Затем в каждом функциональном тесте, который вы выполняете вся база данных будет перестроена, и все приспособления будут загружены