Symfony4 学说单元测试:实体在缓存中有旧数据?

Posted

技术标签:

【中文标题】Symfony4 学说单元测试:实体在缓存中有旧数据?【英文标题】:Symfony4 doctrine unit tests: entity has old data in cache? 【发布时间】:2020-11-04 02:39:04 【问题描述】:

我正在开发一个 Symfony4 应用程序并想测试一个服务是否真的更新了我的数据库。

这里我给出一个数据传输对象

public function update(ChargeDto $chargeDto): ChargeDto

    $charge = $this->chargeRepository->find($chargeDto->id);
    // The mapper fills the new data into my entity
    $charge = ChargeMapper::fromDto($charge, $chargeDto);
    // here I check that the entity has in fact the new data 
    VarDumper::dump($charge->getAuthorPNumber());

    $this->entityManager->persist($charge);
    $this->entityManager->flush();
    $this->entityManager->refresh($charge);
    // here I check that the entity still has the new data 
    VarDumper::dump($charge->getAuthorPNumber());

    return ChargeMapper::toDto($charge, $chargeDto);

在我的测试类中,我从数据库中获取更新的数据集以检查它是否真的更新了:

    $res = $this->chargeRepo->find($updatedDto->id);
    VarDumper::dump($res->getAuthorPNumber());

我得到了旧数据。如果我手动查看数据库,我发现它实际上已更新并包含新值。

我不知道有任何缓存被主动激活。 我的测试如何才能获得真正的新值和更新值

P.S.:我刚刚仔细检查了:对于 prod 环境,我有一个用于学说缓存 ( /config/prod/doctrine.yaml ) 的配置,但对于 dev 和 test 环境都没有。

【问题讨论】:

您的 entityManager 应该有一个名为 clear 的函数,它将删除缓存的对象。 (确保你只在测试中而不是在实际代码中调用它) 完美!你想把它添加为答案吗? 【参考方案1】:

您的entityManager 应该有一个名为 clear 的函数,它将删除缓存的对象。 (确保你只在测试中而不是在实际代码中调用它)

您还可以通过将 EntityName 作为参数传递给函数来从缓存中仅清除一种类型的实体。

【讨论】:

以上是关于Symfony4 学说单元测试:实体在缓存中有旧数据?的主要内容,如果未能解决你的问题,请参考以下文章

学说 2 和 ORM:如何缓存某个实体的每个查询?

从 symfony 4 中彻底删除实体

Symfony4 使用 crud 生成 API 休息

Symfony4中的单元测试接口测试

Symfony 4.3 学说迁移问题

与连接表的一个实体的适当实体关联映射(学说 2)