Тесты 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.

Author: A.L, 2014-07-02

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;
  }
}
 3
Author: Guido Kritz, 2014-07-10 20:09:49

Есть способ сделать это, вы должны написать свой собственный веб-тест, который расширяет тот, который предоставляется Symfony

Symfony\Bundle\FrameworkBundle\Test\WebTestCase

В методе загрузки вашего собственного веб-теста вы просто используете компонент command для:

  • Удалите базу данных
  • Создайте схему
  • загрузите приспособления

Не забывай! Если вы выполняете команды, определите --env как тест! В противном случае вы удалите свою базу данных prod

Затем в каждом функциональном тесте, который вы выполняете вся база данных будет перестроена, и все приспособления будут загружены

 1
Author: Nextar, 2014-07-02 12:35:56