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 TestsFeature; use TestsTestCase; use AppEventsOrderReSent; 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 AppEvents; use IlluminateBroadcastingChannel; use IlluminateQueueSerializesModels; use IlluminateBroadcastingPrivateChannel; use IlluminateBroadcastingPresenceChannel; use IlluminateFoundationEventsDispatchable; use IlluminateBroadcastingInteractsWithSockets; use IlluminateContractsBroadcastingShouldBroadcast; 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 IlluminateBroadcastingPrivateChannel
, which extends IlluminateBroadcastingChannel (and it is a child class, so I don’t understand why it would throw this error):
namespace IlluminateBroadcasting; 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) TestsFeatureMyEventTest::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
Advertisement
Answer
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