doctrine-orm - 对于引用的 DataFixtures Symfony4 / Doctrine,setId 被忽略
问题描述
我正在使用 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);
如您所见,我为 Hermione 设置了 ID,但是如果我在测试中执行 var_dump,我会看到用户 ID 会随着我正在运行的每个测试的用户数量而增加。(9、18、27....)
结果是,在我的测试中,我必须通过唯一的电子邮件地址获取用户,这是可能的,但很烦人:
$userRepo = $this->em->getRepository(User::class);
$this->user = $userRepo->findOneBy(['email' => 'test9@example.com']);
var_dump($this->user->getId());
有没有可能改变这个,所以我可以通过 Id 获取我的用户?
配置:
"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"
},
解决方案
正确的方法是在每个类/为您的测试套件中创建一个setUp
和tearDown
方法。使用这些方法,您可以在每次运行时在数据库中创建/截断测试数据。
根据数据库测试的 Phpunit 文档,设置将在运行测试之前清理
PHPUnit 将对您指定的所有表执行 TRUNCATE 以将其状态重置为空。
只有截断,不重置自动增量值。
要清理数据库密钥,您应该使用tearDown
测试来重置密钥
ALTER TABLE 表名 AUTO_INCREMENT = 1
这将在每次测试后重置自动增量值。
要仅使用 symfony 来实现这一点,您可以创建一个命令来执行以下操作:
- 重置测试数据库
./app/console doctrine:fixtures:load --purge-with-truncate
在 SO 上找到此命令 - 创建夹具
- 执行你的测试运行
您将有 1 个命令仅使用 symfony 运行测试。
推荐阅读
- json - 从多列创建 jsonb
- javascript - 组件不等待 http 请求负载
- ajax - WC 使用 Ajax 添加到购物车 - 仅添加第一个产品
- optaplanner - 在另一个类中有一个 PlanningEntity
- networking - 使用 tc-ebpf 卸载 Vlan
- tensorflow - 仅保存可训练权重 - Tensorflow 模型
- javascript - 角,@Injectable
- node.js - 我无法通过 axios 发送数据
- javascript - 如何在 React 中将数据从 CKEditor 发布到 json 服务器
- mysql - 创建免费的远程数据库并连接到 shinyapp(本地或托管在 AWS/shinyapps.io)