How to solve "PHP Fatal error: Declaration must be comatible with PHPUnit\Framework\TestCase::getStatus()"?

How to solve "PHP Fatal error: Declaration must be comatible with PHPUnit\Framework\TestCase::getStatus()"?

我使用 PHPUnit 9.0., Laravel framework 8.* 和 PHP 7.4.

我 运行 通过使用具有与 PhpUnit Framework 中的 class 相同方法名称的 Trait 导致 PHP 致命错误。

错误是:

PHP Fatal error:  Declaration of App\Traits\ExampleTrait::getStatus(App\Example\ExampleConnectionInterface $example_connection, $unique_id) 
must be compatible with PHPUnit\Framework\TestCase::getStatus(): int in /home/vagrant/code/tests/Integration/JobTests/ExampleJobTest.php 
on line 204

ExampleJobTest.php 看起来像这样:

<?php

namespace Tests\Integration\JobTests\Examples;

use App\Traits\ExampleTrait;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use WithoutMiddleware;
    use DatabaseTransactions;
    use ExampleTrait;

    protected function setUp(): void
    {
        parent::setUp();

        $this->example_connection = new ExampleConnection();
    }

}

我必须多次使用 App\Traits\ExampleTrait 进行不同的测试,并且每次我 运行 都会出现此错误。当我将函数 App\Traits\ExampleTrait::getStatus(...) 重命名为另一个名称时,不会发生错误。

当然,最简单和最快的方法是重命名 App\Traits\ExampleTrait 中的函数,但我的团队要求我找到其他解决方案。

那么,有没有办法在不重命名 App\Traits\ExampleTrait 中的函数名称的情况下 修复此错误?

PHPUnit 的 TestCase class 已经使用了一个名为 getStatus 的方法。如果签名不匹配,您不能覆盖它,并且您不应该覆盖它,除非您确实需要覆盖它。 PHPUnit 内部使用此方法


解决方案:为该方法选择一个不同的名称,您就完成了。

您只需在 ExampleTest

中重命名 ExampleTrait::getStatus
use ExampleTrait {
    ExampleTrait::getStatus as exampleTraitGetStatus;
}

首先,你应该 NEVER use (一个特征)来自 App 测试 class... 所以你已经做错事了...

其次,错误解释得很好,你重写了 PHPUnit\Framework\TestCase::getStatus 因为你的特征实现了相同的方法,所以你有一些解决方案:

  1. 停止使用你的 test/move 里面的 trait 到 tests 文件夹并重命名方法。
  2. 为方法使用别名:
use ExampleTrait {
    ExampleTrait::getStatus as exampleGetStatus;
}
  1. 我不知道 getStatus 在做什么(也请重命名你的特征,ExampleTrait 到底是什么?),但你可以更新 getStatus 以具有相同的签名作为 TestCase 方法。你的特征方法应该是 getStatus(): int 没有任何参数,但我怀疑这会解决你的问题,因为我不知道你用这个方法做什么...

因此,最适合您的解决方案是 1.