phpstan / phpstan-doctrine

Doctrine extensions for PHPStan
MIT License
565 stars 93 forks source link

Call to EntityManager::clear in loop not detected #595

Open Khartir opened 5 days ago

Khartir commented 5 days ago

I'm currently in the process of upgrading phpstan an phpstan-doctrine to the current version (phpstan 1.11.6, phpstan-doctrine 1.4.4) and I'm encountering a new error.

We have a test like the following:

public function testCleanup(EntityManager $entityManager): void
{
    if ([] !== $entityManager->getRepository(Favourite::class)->findAll()) {
        self::markTestSkipped('Invalid setup');
    }

    foreach ([1,2,3] as $dummy) {
        // setup ...
        $entityManager->clear();
    }

    self::assertCount(4, $entityManager->getRepository(Favourite::class)->findAll());

    // ...
}

This test reports Call to static method PHPUnit\Framework\Assert::assertCount() with 4 and array{} will always evaluate to false.. When adding a $entityManager->clear(); outside the loop, no error is reported.

ondrejmirtes commented 5 days ago

As a workaround do this:


public function testCleanup(EntityManager $entityManager): void
{
    $initial = $entityManager->getRepository(Favourite::class)->findAll();
    if ([] !== $initial) {
        self::markTestSkipped('Invalid setup');
    }

    foreach ([1,2,3] as $dummy) {
        // setup ...
        $entityManager->clear();
    }

    $favourites = $entityManager->getRepository(Favourite::class)->findAll();

    self::assertCount(4, $favourites);

    // ...
}