Reputation: 33
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:
• Tests\Feature\ProjectDashboardTest > 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 Tests\Feature\DashboardTest
✓ dashboard returns200
⨯ dashboard returns200 v2
---
• Tests\Feature\DashboardTest > 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 Illuminate\Foundation\Application(
$_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(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::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;
Upvotes: 3
Views: 2073
Reputation: 1188
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.
Upvotes: 3