PHPUnit,Laravel:当前类作用域没有父级时,无法使用“parent”

9
我正在使用PHP 7.4上的PHPUnit 6.5.13和Laravel 5.5。我最近从PHP 7.2升级到了7.4,似乎这触发了错误。
在我的测试中,我使用$this->expectsEvents来测试事件是否被触发。测试类看起来有点像这样:
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看起来像这样(我尝试注释掉broadcastOn和remove InteractsWithSockets的使用,但结果没有改变):
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');
    }
}

我只在Illuminate\Broadcasting\PrivateChannel中看到了parent::__construct的调用,这个类继承自Illuminate\Broadcasting\Channel(并且它是子类,所以我不知道为什么会出现这个错误):

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);
    }
}

堆栈跟踪看起来像这样,让我相信 Mockery 是罪魁祸首:
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
2个回答

10

我遇到了同样的问题——原来我的composer.json中设置了版本为0.9mockery/mockery。将mockery/mockery升级到版本1.3后,问题得到了解决。

相关composer.json片段:

        "mockery/mockery": "~1.3.0",
        "phpunit/phpunit": "~8.0",

尝试设置相同的版本并运行composer update

我在考虑这个问题,但我们目前使用了几个不同的PHP版本,分别是7.0、7.2和一些7.3。我希望将我们升级到7.4,但有点担心向后兼容性,因为我们还没有准备好升级我们的7.0站点。我会尽快给您反馈结果:p - Nict
测试在 PHP 7.2、7.3 和 7.4 上运行良好。这似乎解决了问题。非常感谢! - Nict
@Robert Trzebiński - 这个帮助解决了我的问题。谢谢!你知道在嘲弄中到底更新了什么来解决这个问题吗? - undefined

1

可能的罪魁祸首是由于setUptearDown的新语法要求。

源代码

这可能是由于缺少返回类型void引起的。

例如,将此更改为:

public function setUp()
{
    parent::setUp();
}

public function tearDown()
{
    parent::tearDown();

}

转换为:

public function setUp() : void
{
    parent::setUp();
}

public function tearDown() : void
{
    parent::tearDown();

}

注意:我发现这个问题是在寻找单元测试中的错误信息时发现的,奇怪的是它与 m::close() 有关,因此我描述了一个与原始问题不同的问题,但我的答案仍然相关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接