Skip to content
Advertisement

Error when running multiple PHPUnit Tests in Laravel 8

Unit testing in a Laravel 8 project is throwing an error when more than one test is called. The issue is causing my tests to fail when I run more than one at once. When running a batch of tests the first one runs and passes as expected, Then all subsequent tests fail when trying to run the createApplication() function from the default trait CreatesApplication. All of my tests have been run individually and pass.

Causing this error:

• TestsFeatureProjectDashboardTest > dashboard returns200
   Error

  Call to a member function make() on bool

  at tests/CreatesApplication.php:19
     15▕     public function createApplication()
     16▕     {
     17▕         $app = require_once __DIR__.'/../bootstrap/app.php';
     18▕
  ➜  19▕         $app->make(Kernel::class)->bootstrap();
     20▕
     21▕         return $app;
     22▕     }
     23▕ }

This occurs when the two tests run are identical.

So this code:

class DashboardTest extends TestCase
{

    public function testDashboardReturns200()
    {
        $response = $this->get('/dashboard');
        $response->assertStatus(200);
    }

    public function testDashboardReturns200V2()
    {
        $response = $this->get('/dashboard');
        $response->assertStatus(200);
    }
}

Gives this result:

php artisan test ./tests/feature/DashboardTest.php

   FAIL  TestsFeatureDashboardTest
  ✓ dashboard returns200
  ⨯ dashboard returns200 v2

  ---

  • TestsFeatureDashboardTest > dashboard returns200 v2
   Error

  Call to a member function make() on bool

  at tests/CreatesApplication.php:19
     15▕     public function createApplication()
     16▕     {
     17▕         $app = require_once __DIR__.'/../bootstrap/app.php';
     18▕
  ➜  19▕         $app->make(Kernel::class)->bootstrap();
     20▕
     21▕         return $app;
     22▕     }
     23▕ }


  Tests:  1 failed, 1 passed
  Time:   4.02s

Is there a fix I am missing?

Edit, Added App file as requested

<?php

/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/

$app = new IlluminateFoundationApplication(
    $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);

/*
|--------------------------------------------------------------------------
| Bind Important Interfaces
|--------------------------------------------------------------------------
|
| Next, we need to bind some important interfaces into the container so
| we will be able to resolve them when needed. The kernels serve the
| incoming requests to this application from both the web and CLI.
|
*/

$app->singleton(
    IlluminateContractsHttpKernel::class,
    AppHttpKernel::class
);

$app->singleton(
    IlluminateContractsConsoleKernel::class,
    AppConsoleKernel::class
);

$app->singleton(
    IlluminateContractsDebugExceptionHandler::class,
    AppExceptionsHandler::class
);

/*
|--------------------------------------------------------------------------
| Return The Application
|--------------------------------------------------------------------------
|
| This script returns the application instance. The instance is given to
| the calling script so we can separate the building of the instances
| from the actual running of the application and sending responses.
|
*/

return $app;

Advertisement

Answer

Because you run require_once, the script isn’t loaded a second time and will therefor return a boolean. Replace require_once with require to solve it.

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement