Doctrine flush 方法是否异步工作?
Do Doctrine flush method works asynchronous?
我有一个功能测试,它创建了多个记录,然后进行了一些请求调用,测试有时会通过,而其他的则不会,这真的很奇怪,当我使用 var_dump 时,它有时会给我我的记录数量需要,而其他时候它只会给我更少。
这是代码:
foreach (range(0, 80) as $number)
{
$citaDetalle = new CitasDetalle();
$citaDetalle->setCodigo('FF#')
->setCitaGenerator($generator)
->setUidCreate($user)
->setFechaCita( DateExtension::nextLaborDay((new \DateTime())->modify("+5 Day"), false, false) )
->setCitaTurno($turno)
->setCitaPlace($place)
;
$em->persist($citaDetalle);
}
foreach (range(0, 20) as $number)
{
$citaDetalle = new CitasDetalle();
$citaDetalle->setCodigo('FF#')
->setCitaGenerator($generator)
->setUidCreate($user)
->setFechaCita( DateExtension::nextLaborDay((new \DateTime())->modify("+5 Day"), false, false) )
->setCitaTurno($turno2)
->setCitaPlace($place)
;
$em->persist($citaDetalle);
}
$em->flush();
$crawler = $this->client->request('GET', '/c/g/citas/new');
$this->assertEquals(200, $this->client->getResponse()->getStatusCode(),
"Unexpected HTTP status code for GET /c/g/citas/new");
$form = $crawler->selectButton('Generar Cita')->form([
'core_gestion_bundle_citas_detalle_type[citaGenerator]' =>
$crawler->filter('#core_gestion_bundle_citas_detalle_type_citaGenerator option:contains("Generator Test")')->attr('value')
]);
$this->client->submit($form);
$this->client->followRedirect();
$lastDate = $em->getRepository('CoreGestionBundle:CitasDetalle')
->obtenerUltimaCita()[0]->getFechaCita();
$compareDate = DateExtension::nextLaborDay((new \DateTime())->modify("+6 Day"));
$this->assertEquals($compareDate->format('Y-m-d'), $lastDate->format('Y-m-d'));
这不是测试事物的正确方法。为什么要在数据库中一遍又一遍地创建记录?这与 DataFixtures 一样愚蠢,你可以达到同样的效果,但你只能做一次(而且,更重要的是,你不需要“乱扔你的测试代码”)。
还请记住,您的数据库应该在每次测试时被清除和恢复(或者,如果您能够做到这一点,请使用事务测试“写入”到数据库,并在 tearDown() 函数中丢弃更改)
回答你的问题
不,学说不会异步做事。嗯,你的问题一定出在其他地方。
我有一个功能测试,它创建了多个记录,然后进行了一些请求调用,测试有时会通过,而其他的则不会,这真的很奇怪,当我使用 var_dump 时,它有时会给我我的记录数量需要,而其他时候它只会给我更少。
这是代码:
foreach (range(0, 80) as $number)
{
$citaDetalle = new CitasDetalle();
$citaDetalle->setCodigo('FF#')
->setCitaGenerator($generator)
->setUidCreate($user)
->setFechaCita( DateExtension::nextLaborDay((new \DateTime())->modify("+5 Day"), false, false) )
->setCitaTurno($turno)
->setCitaPlace($place)
;
$em->persist($citaDetalle);
}
foreach (range(0, 20) as $number)
{
$citaDetalle = new CitasDetalle();
$citaDetalle->setCodigo('FF#')
->setCitaGenerator($generator)
->setUidCreate($user)
->setFechaCita( DateExtension::nextLaborDay((new \DateTime())->modify("+5 Day"), false, false) )
->setCitaTurno($turno2)
->setCitaPlace($place)
;
$em->persist($citaDetalle);
}
$em->flush();
$crawler = $this->client->request('GET', '/c/g/citas/new');
$this->assertEquals(200, $this->client->getResponse()->getStatusCode(),
"Unexpected HTTP status code for GET /c/g/citas/new");
$form = $crawler->selectButton('Generar Cita')->form([
'core_gestion_bundle_citas_detalle_type[citaGenerator]' =>
$crawler->filter('#core_gestion_bundle_citas_detalle_type_citaGenerator option:contains("Generator Test")')->attr('value')
]);
$this->client->submit($form);
$this->client->followRedirect();
$lastDate = $em->getRepository('CoreGestionBundle:CitasDetalle')
->obtenerUltimaCita()[0]->getFechaCita();
$compareDate = DateExtension::nextLaborDay((new \DateTime())->modify("+6 Day"));
$this->assertEquals($compareDate->format('Y-m-d'), $lastDate->format('Y-m-d'));
这不是测试事物的正确方法。为什么要在数据库中一遍又一遍地创建记录?这与 DataFixtures 一样愚蠢,你可以达到同样的效果,但你只能做一次(而且,更重要的是,你不需要“乱扔你的测试代码”)。
还请记住,您的数据库应该在每次测试时被清除和恢复(或者,如果您能够做到这一点,请使用事务测试“写入”到数据库,并在 tearDown() 函数中丢弃更改)
回答你的问题
不,学说不会异步做事。嗯,你的问题一定出在其他地方。