Symfony 5 - PhpUnit - 运行 测试时数据库未刷新

Symfony 5 - PhpUnit - Database not refresh on running test

我注意到,当我 运行 使用 PhpUnit 进行功能测试时,如果数据库中有修改,就会完成。但是,如果我在测试过程中想要恢复被更改的记录,它会以旧版本返回给我,这是非常有问题的。

例如,如果我有一个测试:

  1. 我收集了某个物品
  2. 我通过控制器的 URL 激活它(因此,在数据库中修改其启用 属性)
  3. 我想检查它是否有效
  4. 我又从数据库中取回了
  5. 我检查它是否有效

嗯,那会 return 我的旧物品给我,并告诉我它不活跃。

这迫使我创建第二个测试来检索它,然后检查它是否处于活动状态

    public function testEnableArticle()
    {
        $article = $this->getLastArticle(); //Find last article
        $admin = $this->getAdmin();
        
        $this->client->loginUser($admin);
        
        // Request to enable last article
        $this->client->request('GET', sprintf("/admin/articles/%s/enable", $article->getId()));
        
        // Now my article should be enabled :
            $updatedArticle = $this->getLastArticle();
            $this->assertSame(1, $updatedArticle->getEnable());
        // But return false because here my article seems to be the previous version before enable
    }
   

所以我需要在获得更新文章之后进行第二次测试:

    public function testLastArticleIsEnabled()
    {
        $updatedArticle = $this->getLastArticle();
        $this->assertSame(1, $updatedArticle->getEnable());
        
        // And here, it works
    }

为了获取我的上一篇文章,我正在使用我的自定义函数:

    public function getLastArticle()
    {
        return $this->manager->getRepository(Article::class)->findLastArticle();
    }

这很奇怪... 有人可以帮我吗?

这是教义行为,它会在您获取实体后将其保存在内存中。它不会再次从数据库中获取它,因此您只有一个实例。尝试:

$this->client->request('GET', sprintf("/admin/articles/%s/enable", $article->getId()));
$this->em->refresh(article);