Странное поведение доктрины Symfony во время теста phpunit - поле в базе данных становится нулевымPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Странное поведение доктрины Symfony во время теста phpunit - поле в базе данных становится нулевым

Сообщение Anonymous »

Я использую
  • Symfony v6.4.8
  • doctrine/orm 2.19.5
  • phpunit/phpunit 9.6.19
Я создал конечную точку GET REST API /api/contract/{$id} в Symfony.
Он выполняет запрос API в другой системе, получает эти данные, объединяет их с данными локальной базы данных и создает новую запись в моей базе данных.
У меня проблема в том, что / после persist()/flush() в базе данных: иногда поле $contract->eup имеет значение NULL в база данных. определяется как nvarchar(10) в базе данных MSSQL.

Код: Выделить всё

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']);
}
}
Когда я вызываю свой API с помощью Postman, запись создается правильно, а поле eup в базе данных заполняется строкой .
Но когда я запускаю тест phpunit php bin/phpunit --filter myTest, он вызывает API, создается запись .
Strong> в базе данных, но поле eup имеет значение NULL.
  • Другие поля этой записи хранятся < strong>правильно при тесте.
  • Также можно записать значение этого поля в другие поля.
  • Также пробовал использовать более короткую строку, но она тоже не сохраняется.
  • Я также провел тест с помощью xdebug и могу подтвердить (вместе с моим коллегой), что $contract->eup установлен и заполнен строкой в ​​$em->persist($contract) ; но когда мы смотрим после сброса в базе данных SELECT * FROM ..., поле eup имеет значение NULL.
У вас есть идеи, что может быть не так?
Обновление 2:
Я обновил конфигурацию регистратора/packages/monolog.yaml< /p>

Код: Выделить всё

# 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})
Поле eup отсутствует в команде SQL!
Однако я не знаю, что изменить, поскольку это поле там используется.< /п>

Подробнее здесь: https://stackoverflow.com/questions/786 ... es-null-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»