Symfony 5 - PhpUnit - База данных не обновляется sh при запущенном тесте - PullRequest
2 голосов
/ 03 августа 2020

Я заметил, что когда я запускаю функциональный тест с PhpUnit, если в базе данных есть модификация, это делается. Однако, если я нахожусь в середине своего теста и хочу восстановить запись, которая была изменена, она возвращается мне в своей старой версии, что очень проблематично. c.

Например, если У меня есть тест, в котором:

  1. Я собираю определенный элемент
  2. Я активирую его (следовательно, изменение в базе данных его свойства enable) через URL-адрес контроллера
  3. Я хочу проверить, что он активен
  4. Я снова извлекаю его из базы данных
  5. Проверяю, что он активен

Ну, это ' Я верну мне свой старый элемент и скажу, что он не активен.

Это заставляет меня создать второй тест, чтобы получить его, а затем проверить, что он активен

    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();
    }

Это очень странно ... Может кто-нибудь поможет мне, пожалуйста?

1 Ответ

2 голосов
/ 03 августа 2020

Это поведение doctrine, оно сохраняет вашу сущность в памяти после того, как вы ее загрузили. Он не будет получать его снова из базы данных, поэтому у вас один и только один экземпляр. Попробуйте:

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