【问题标题】:Do Doctrine flush method works asynchronous?Doctrine 刷新方法异步工作吗?
【发布时间】:2016-03-01 23:42:13
【问题描述】:

我有一个功能测试,它创建了几条记录,然后进行了一些请求调用,测试有时通过而其他测试不通过,这真的很奇怪,当我使用 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'));

【问题讨论】:

  • Doctrine 同步做事。您可以确定在$em->flush(); 之后您的数据在数据库中。问题出在其他地方。我建议检查日期生成/转换。有时它会以不同的方式舍入秒数,这可能是您的测试中的问题。

标签: php symfony doctrine-orm phpunit


【解决方案1】:

这不是测试事物的正确方法。为什么要在数据库中一遍又一遍地创建记录?就像DataFixtures 一样愚蠢,您可以达到相同的效果,但您只能执行一次(更重要的是,您不需要“乱扔测试代码”)。

还请记住,您的数据库应在每次测试时清除和恢复(或者,如果您能够这样做,请使用事务测试“写入”到数据库,并在 tearDown() 函数中丢弃更改)

回答您的问题

不,学说不会异步做事。顺便说一句,你的问题一定出在其他地方。

【讨论】:

  • 好的,谢谢你的回答,我一直在使用fixtures来预加载我在应用程序中需要的数据,比如菜单,但我不知道我可以将它们用作预加载数据来进行测试,所以我应该做的是通过夹具加载该记录只是为了测试?
  • 我创建了github.com/doctrine/dbal/issues/2860,因为它确实没有理由不能同时工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 2015-08-29
相关资源
最近更新 更多