Symfony 5 - PhpUnit - 运行 测试时数据库未刷新
Symfony 5 - PhpUnit - Database not refresh on running test
我注意到,当我 运行 使用 PhpUnit 进行功能测试时,如果数据库中有修改,就会完成。但是,如果我在测试过程中想要恢复被更改的记录,它会以旧版本返回给我,这是非常有问题的。
例如,如果我有一个测试:
- 我收集了某个物品
- 我通过控制器的 URL 激活它(因此,在数据库中修改其启用 属性)
- 我想检查它是否有效
- 我又从数据库中取回了
- 我检查它是否有效
嗯,那会 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);
我注意到,当我 运行 使用 PhpUnit 进行功能测试时,如果数据库中有修改,就会完成。但是,如果我在测试过程中想要恢复被更改的记录,它会以旧版本返回给我,这是非常有问题的。
例如,如果我有一个测试:
- 我收集了某个物品
- 我通过控制器的 URL 激活它(因此,在数据库中修改其启用 属性)
- 我想检查它是否有效
- 我又从数据库中取回了
- 我检查它是否有效
嗯,那会 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);