setId игнорируется для ссылочных DataFixtures Symfony4 / Doctrine - PullRequest
0 голосов
/ 08 октября 2018

Я использую DataFixtures, чтобы заполнить мою тестовую базу данных данными для юнит-тестов.

Для сущностей, которые не используют другие сущности, я могу установить первичный ключ с помощью setId.Для сущностей, которые используются другими сущностями, я могу установить его, но он игнорируется.

Например, я настраиваю своих пользователей так:

    /** @var Gender $genderW */
    $genderM = $this->getReference(GenderFixtures::TEST_GENDER_W);

    $date = new DateTime('now');
    /** @var User $user */
    $user = new User();
    $user
        ->setId(9)
        ->setFirstName('Hermione')
        ->setLastName('Granger')
        ->setEmail('test9@example.com')
        ->setGender($genderM)
        ->setPassword('odsf3_!45sr-f')
        ->setCreated($date);

    $manager->persist($user);

    $manager->flush();

    $this->addReference(self::TEST_USER_REFERENCE_9, $user);

Как видите, я установил Idдля Гермионы, но если я сделаю var_dump в своих тестах, я вижу, что идентификатор пользователя увеличивается на количество пользователей в каждом тесте, который я запускаю.(9, 18, 27 ....)

В результате в моих тестах мне приходится выбирать пользователей по уникальному адресу электронной почты, что возможно, но очень раздражает:

    $userRepo = $this->em->getRepository(User::class);
    $this->user = $userRepo->findOneBy(['email' => 'test9@example.com']);
    var_dump($this->user->getId());

Есть ли возможность изменить это, чтобы я мог получать своих пользователей по Id?

config:

"require": {
    "php": "7.2.*",
    "ext-ctype": "*",
    "ext-iconv": "*",
    "cache/predis-adapter": "^1.0",
    "doctrine/doctrine-bundle": "^1.6.10",
    "doctrine/doctrine-migrations-bundle": "^1.3",
    "doctrine/orm": "^2.5.11",
    "eightpoints/guzzle-bundle": "~7.3.1",
    "friendsofsymfony/rest-bundle": "^2.3",
    "guzzlehttp/guzzle": "^6.3",
    "jms/serializer-bundle": "^2.4",
    "predis/predis": "^1.1",
    "sensio/framework-extra-bundle": "^5.2",
    "snc/redis-bundle": "3.x-dev",
    "symfony/apache-pack": "^1.0",
    "symfony/console": "^4.1",
    "symfony/flex": "^1.0",
    "symfony/framework-bundle": "^4.1",
    "symfony/lts": "^4@dev",
    "symfony/monolog-bundle": "^3.1",
    "symfony/orm-pack": "^1.0",
    "symfony/polyfill-apcu": "^1.5",
    "symfony/security-bundle": "^4.0",
    "symfony/swiftmailer-bundle": "^3.2",
    "symfony/twig-bundle": "^4.1",
    "symfony/validator": "^4.1",
    "symfony/yaml": "^4.1"
},
"require-dev": {
    "diablomedia/phpunit-pretty-printer": "2.0.*",
    "doctrine/doctrine-fixtures-bundle": "^3.0",
    "friendsofphp/php-cs-fixer": "*",
    "phpmd/phpmd": "^2.6",
    "sensiolabs/security-checker": "^4.1",
    "squizlabs/php_codesniffer": "*",
    "symfony/dotenv": "^4.1",
    "symfony/maker-bundle": "^1.5",
    "symfony/phpunit-bridge": "^4.1",
    "symfony/var-dumper": "^4.1"
},

1 Ответ

0 голосов
/ 08 октября 2018

Правильный способ - создать метод setUp и tearDown в каждом классе / для вашего Testsuite.С помощью этих методов вы можете создавать / усекать тестовые данные в своей базе данных каждый раз, когда они запускаются.

В соответствии с документацией Phpunit для Databasetesting установка будет очищена до запуска теста

PHPUnit выполнит TRUNCATE для всех указанных вами таблиц, чтобы сбросить их статус до пустого.

Только с усечением, без сброса значений автоинкремента.

Для очистки ключей базы данных вы должны использовать tearDown для теста для сброса ключей

ALTER TABLE tablename AUTO_INCREMENT = 1

Это сбросит значения автоинкрементапосле каждого теста.


Чтобы достичь этого только с Symfony, вы можете создать команду, которая будет выполнять следующие действия:

  1. Сбросить базу тестов ./app/console doctrine:fixtures:load --purge-with-truncate найденэта команда для SO
  2. Создание приборов
  3. Выполнение вашего теста

У вас будет 1 команда для запуска ваших тестов только с использованием Symfonу.

...