Search code examples
phplaravelphpunitlaravel-testing

Laravel phpunit tests Cannot find TestCase object on call stack


where running all test php artisan test everything work as expected and all tests runs

enter image description here

now , when i run signle test php artisan test --filter test_get_profile i get this wired error

An error occurred inside PHPUnit.

Message:  Cannot find TestCase object on call stack
Location: D:\laragon\www\project\vendor\phpunit\phpunit\src\TextUI\TestRunner.php:68

but some other tests still work, for example, test_login and test_register works , but when i create a new test sometimes it work sometimes i get this wired error

PS: i add the file path example php artisan test tests/Feature/AccountTest.php --filter test_get_profile i didnt get any error , but i dont what to always include the file path

please note that all tests are empty

public function test_get_profile(): void
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }

anyone know the issue ? i'm using laravel 10 and phpunit 10

phpunit.xml:

<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         colors="true"
>
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <source>
        <include>
            <directory suffix=".php">./app</directory>
        </include>
    </source>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <!-- <env name="DB_CONNECTION" value="sqlite"/> -->
        <!-- <env name="DB_DATABASE" value=":memory:"/> -->
        <env name="MAIL_MAILER" value="array"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="TELESCOPE_ENABLED" value="false"/>
    </php>
</phpunit>

UserTest.php


namespace Tests\Feature;

use Tests\TestCase;

class UserTest extends TestCase
{
    public function test_login(): void
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }

    public function test_register(): void
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

AccountTest.php


namespace Tests\Feature;

use Tests\TestCase;

class AccountTest extends TestCase
{
    /**
     * A basic feature test example.
     */
    public function test_get_profile(): void
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

Solution

  • This was a bug in PHPUnit.

    https://github.com/sebastianbergmann/phpunit/issues/5403

    This is the fix -

    https://github.com/sebastianbergmann/phpunit/commit/16166431bce84bb100d8e7fe867d612bdfe61776#diff-548ab8441af390a03ab9bf5e83a441aaa67c43de14b247a1426c2983b434bd89

    Run a composer update to get the latest version.