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