I'm using PHPUnit 6.5.13 and Laravel 5.5 on PHP 7.4. I recently upgraded from PHP 7.2 to 7.4. and it seems like that triggered the error.
In my test I use $this->expectsEvents
in order to test that an event is fired. The test class looks a little like this:
namespace Tests\Feature;
use Tests\TestCase;
use App\Events\OrderReSent;
class MyEventTest extends TestCase {
/** @test */
public function authenticated_client_can_resend()
{
$this->expectsEvents(OrderReSent::class); // there is some more code but this is the line that returns the error
}
}
OrderReSent looks like this (I've tried commenting out broadcastOn and remove InteractsWithSockets use, no change in result):
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class OrderReSent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $invoiceId;
public function __construct($invoiceId)
{
$this->invoiceId = $invoiceId;
}
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
The only place I see parent::__construct being called is in Illuminate\Broadcasting\PrivateChannel
, which extends Illuminate\Broadcasting\Channel (and it is a child class, so I don't understand why it would throw this error):
namespace Illuminate\Broadcasting;
class PrivateChannel extends Channel
{
/**
* Create a new channel instance.
*
* @param string $name
* @return void
*/
public function __construct($name)
{
parent::__construct('private-'.$name);
}
}
The stacktrace looks like this and makes me believe Mockery is the culprit:
1) Tests\Feature\MyEventTest::authenticated_client_can_resend
ErrorException: Cannot use "parent" when current class scope has no parent
/project-root/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php:16
/project-root/vendor/mockery/mockery/library/Mockery/Loader/EvalLoader.php:16
/project-root/vendor/mockery/mockery/library/Mockery/Container.php:219
/project-root/vendor/mockery/mockery/library/Mockery.php:89
/project-root/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MocksApplicationServices.php:99
/project-root/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MocksApplicationServices.php:54
/project-root/tests/Feature/MyEventTest.php:29
I had same issue - it turned out that mockery/mockery
was set to version 0.9
in my composer.json
. Upgrading mockery/mockery
to version 1.3
solved the problem for me.
Related composer.json
fragment:
"mockery/mockery": "~1.3.0",
"phpunit/phpunit": "~8.0",
Try setting same versions and run composer update
The likely culprit is due to new syntax requirements for setUp
and tearDown
.
Source
It can be caused by a missing return type, which is void
.
For example, change this:
public function setUp()
{
parent::setUp();
}
public function tearDown()
{
parent::tearDown();
}
to this:
public function setUp() : void
{
parent::setUp();
}
public function tearDown() : void
{
parent::tearDown();
}
Note: I found this question looking for the error message in a unit test, and oddly enough it was related to m::close()
, so I'm describing a different problem than the original question, but my answer will be relevant.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With