Я использую PHPUnit 9.0., Laravel framework 8.* и PHP 7.4.
Я столкнулся с фатальной ошибкой PHP, используя Trait с тем же именем метода, что и класс в PhpUnit Framework.
Ошибка:
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\Framework\TestCase не является чертой, и, как сказано в документации, вместо нее можно использовать псевдоним. Но в моем случае у меня есть черта и абстрактный класс
ах извините, я неправильно прочитал.






Класс PHPUnit TestCase уже использует метод с именем getStatus. Вы не можете переопределить его, если подписи не совпадают, и вы переопределяете его не должна, если только вам действительно не нужно это переопределять. PHPUnit использует этот метод внутри
Решение: выберите другое имя для этого метода, и все готово.
Можете просветить по этому поводу?.
Какой у вас вопрос по этому поводу?
Вы должны предоставить рабочее решение с примерами, как указано выше.
«Выберите другое имя для этого метода, и все готово» — есть ли что-то непонятное в этом намеке?
Вы можете просто переименовать ExampleTrait::getStatus в ExampleTest
use ExampleTrait {
ExampleTrait::getStatus as exampleTraitGetStatus;
}
Прежде всего, вы должны НИКОГДАuse (черта) из App внутри тестового класса... Значит, вы уже что-то делаете не так...
Во-вторых, ошибка довольно понятна, вы переопределяете PHPUnit\Framework\TestCase::getStatus, потому что ваш трейт реализует тот же метод, поэтому у вас есть несколько решений:
tests и переименуйте метод.use ExampleTrait {
ExampleTrait::getStatus as exampleGetStatus;
}
getStatus (также переименуйте свой трейт, пожалуйста, что за чертовщина ExampleTrait?), но вы можете обновить getStatus, чтобы он имел ту же подпись, что и метод TestCase. Метод вашей черты должен быть getStatus(): int без каких-либо параметров, но я сомневаюсь, что это решит вашу проблему, поскольку я понятия не имею, для чего вы используете этот метод...Итак, лучшим решением для вас будет 1..
Вы можете использовать ключевые слова вместо и псевдоним для разрешения конфликта. Для получения дополнительной информации см. php-документы php.net/manual/en/language.oop5.traits.php.