Как решить «Неустранимая ошибка PHP: объявление должно быть совместимо с PHPUnit\Framework\TestCase::getStatus()»?

Я использую 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?

Вы можете использовать ключевые слова вместо и псевдоним для разрешения конфликта. Для получения дополнительной информации см. php-документы php.net/manual/en/language.oop5.traits.php.

Daniel 22.03.2022 09:06

Нет, это не работает, потому что PHPUnit\Framework\TestCase не является чертой, и, как сказано в документации, вместо нее можно использовать псевдоним. Но в моем случае у меня есть черта и абстрактный класс

Nele 22.03.2022 09:21

ах извините, я неправильно прочитал.

Daniel 22.03.2022 10:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
57
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Класс PHPUnit TestCase уже использует метод с именем getStatus. Вы не можете переопределить его, если подписи не совпадают, и вы переопределяете его не должна, если только вам действительно не нужно это переопределять. PHPUnit использует этот метод внутри


Решение: выберите другое имя для этого метода, и все готово.

Можете просветить по этому поводу?.

munazzil 23.03.2022 11:58

Какой у вас вопрос по этому поводу?

Nico Haase 23.03.2022 12:08

Вы должны предоставить рабочее решение с примерами, как указано выше.

munazzil 23.03.2022 12:11

«Выберите другое имя для этого метода, и все готово» — есть ли что-то непонятное в этом намеке?

Nico Haase 23.03.2022 12:12

Вы можете просто переименовать ExampleTrait::getStatus в ExampleTest

use ExampleTrait {
    ExampleTrait::getStatus as exampleTraitGetStatus;
}

Прежде всего, вы должны НИКОГДАuse (черта) из App внутри тестового класса... Значит, вы уже что-то делаете не так...

Во-вторых, ошибка довольно понятна, вы переопределяете PHPUnit\Framework\TestCase::getStatus, потому что ваш трейт реализует тот же метод, поэтому у вас есть несколько решений:

  1. Прекратите использовать трейт внутри вашего теста/переместите его в папку tests и переименуйте метод.
  2. Используйте псевдоним для метода:
use ExampleTrait {
    ExampleTrait::getStatus as exampleGetStatus;
}
  1. Я понятия не имею, что делает getStatus (также переименуйте свой трейт, пожалуйста, что за чертовщина ExampleTrait?), но вы можете обновить getStatus, чтобы он имел ту же подпись, что и метод TestCase. Метод вашей черты должен быть getStatus(): int без каких-либо параметров, но я сомневаюсь, что это решит вашу проблему, поскольку я понятия не имею, для чего вы используете этот метод...

Итак, лучшим решением для вас будет 1..

Другие вопросы по теме

Похожие вопросы

Как создать элемент управления Leaflet, расположенный с перетаскиваемым маркером (обновлять широту/долготу при перетаскивании) и значение автоматического обновления в форме широты/долготы
Как получить данные из базы данных и отобразить диапазон строк таблицы в php
Как проверить отправку формы с неправильными значениями, используя компонент сканера Symfony и PHPUnit?
Divi - я скрыл глобальный верхний и нижний колонтитулы и не могу найти способ снова включить
PHP Docker – можно ли установить ulimit во время выполнения?
Пытаюсь получить атрибуты из XML (PHP)
Xdebug xdebug.mode = у меня не работает отладка
SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку в Laravel9
Как получить изображение из URL, отредактировать на лету и сохранить
Проблемы с рендерингом JS и CSS после правила перезаписи URL-адреса файла .htaccess