phpunit 测试期间 symfony 学说的奇怪行为 - 数据库中的字段变为空

问题描述 投票:0回答:1

我正在使用

  • Symfony v6.4.8
  • 教义/规则 2.19.5
  • phpunit/phpunit 9.6.19

我在 Symfony 中构建了一个 REST API GET 端点

/api/contract/{$id}

它在另一个系统上执行 API 请求,接收该数据并将其与本地数据库数据相结合,然后在我的数据库中创建一条新记录。

我遇到的问题是在数据库中的

persist()/flush()
处/之后,有时字段
$contract->eup
是数据库中的
NULL

eup
在 MSSQL 数据库中定义为
nvarchar(10)

private function saveContract(EntityManager $em, array $data): ContractData
{        
    $contract = new ContractData();
    // [... some more variables]
    $contract->setEup($data['eup']);  // example: "2024-06-29"
    
    $em->persist($contract);
    $em->flush();

    return $contract;
}

更新:phpunit 测试的简化代码:

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ContractDataControllerTest extends WebTestCase
{
    public static function contractProvider(): array
    {
        $testCases = array(
            ['18fac35b-4afe-476e-9094-1437deeb6f0a', 'stringValue1', '2024-06-29'],
        );
        return $testCases;
    }
    
    /**
     * @covers \App\Controller\API\ContractDataController::contract
     * @dataProvider contractProvider
     */
    public function testGetContractWhileLoggedIn($id, $expectValue1, $expectEup): void
    {
        $uri = $this->getUriWithSignature('/api/contract/', $id);

        $client = static::createClient();
        $client->disableReboot();
        $client->setServerParameter('HTTP_Authorization', 'Bearer ' . $_ENV['TOKEN']);
        $client->request('GET', $uri);

        $this->assertResponseStatusCodeSame(200);

        $responseData = json_decode($client->getResponse()->getContent(), true);

        $this->assertSame($expectValue1, $responseData['value1']);
        // the other values are working, there are more values to test, code is simplyfied, only eup is empty at database.
        $this->assertSame($expectEup, $responseData['valueEup']); 
    }
}

当我使用 Postman 调用 API 时,会正确创建记录,并且数据库中的

eup
字段会填充字符串。

但是当我运行phpunit测试

php bin/phpunit --filter myTest

时,它调用api,在数据库中创建
记录,但是eup
字段是
NULL

  • 此记录的其他字段在测试时已

    正确存储。

  • 也可以将该字段的值写入其他字段。

  • 还尝试了更短的字符串,但这也没有保存。

  • 我也使用 xdebug 运行了测试,并且可以(与我的同事一起)确认

    $contract->eup

     已设置并在 
    $em->persist($contract);
     处填充了字符串,但是当我们在数据库中查看刷新时 
    SELECT * FROM ...
     字段 eup 是
    NULL

您知道可能出了什么问题吗?

更新2: 我更新了记录器 config/packages/monolog.yaml

# add Doctrine-Handler doctrine: type: stream path: '%kernel.logs_dir%/doctrine.log' level: debug channels: ["doctrine"]
我发现 SQL INSERT INTO 不是我期望的那样:

Executing statement: INSERT INTO contract_data (contract_number) VALUES (?) (parameters: array{"1":"XYZ123456"}, types: array{"1":2})

SQL 命令中缺少 
eup
 字段!

但是我不知道要更改那里使用的字段。

php sql-server symfony doctrine phpunit
1个回答
0
投票
我的解决方案:

删除/var/cache/test/

中的所有文件

之后SQL命令和测试都很好!

© www.soinside.com 2019 - 2024. All rights reserved.