我正在使用
我在 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
。
正确存储。
$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
字段!但是我不知道要更改那里使用的字段。
删除/var/cache/test/