#php #unit-testing #phpunit #typeerror #php-7.2
#php #модульное тестирование #phpunit #ошибка типа #php-7.2
Вопрос:
Это упрощенный пример, поймите проблему.
Код работает У меня проблема, когда я хочу протестировать PHPUnit
IBase.php
namespace interfaces; interface IBase {}
FileNavigate.php
class FileNavigate { private IBase $f3; // lt;= line: 5 #RED public function __construct(IBase $f3, $file = '') { // lt;= #GREEN use IBase $this-gt;f3 = $f3; } }
FileNavigateTest.php
declare(strict_types=1); use PHPUnitFrameworkTestCase; class FileNavigateTest extends TestCase { public function testInterface() { $mock = $this-gt;createMock(interfacesIBase::class); $f3_get_FileNavigate = new FileNavigate($mock); // lt;= line: 10 $this-gt;assertTrue(true); } }
cmd:
PHPUnit 8.5.21 by Sebastian Bergmann and contributors. ..E... 1 / 1 (100%) Time: 8 ms, Memory: 4.00 MB There was 1 error: 1) FileNavigateTest::testInterface ParseError: syntax error, unexpected 'IBase' (T_STRING), expecting function (T_FUNCTION) or const (T_CONST) /html/app/v2/FileNavigate.php:5 /html/tests/FileNavigateTest.php:10 ERRORS! Tests: 1, Assertions: 1, Errors: 1. Script ./vendor/bin/phpunit tests handling the test event returned with error code 2 Script @test was called via t
Я знаю, что ошибка в файле «FileNavigate.php» на линии 5
Только моя IDE работает лучше, когда я использую эту нотацию.
Кто-нибудь знает, как это проверить?
Класс должен проверить, имеет ли полученный объект этот интерфейс, и заменяет класс, у которого уже есть этот интерфейс.
Комментарии:
1. Это упрощенный пример, поймите проблему. класс предназначен для проверки того, имеет ли объект этот интерфейс, класс здесь не используется
2. Попробовал ваш код — работает нормально. Я думаю, что проблема в пространствах имен — старайтесь следовать стандартам PSR.
3. @Maksim Код работает нормально, и это версия 2, я переписываю его для php 7 и хотел использовать ввод переменных, и он работает нормально. У меня проблема, когда я хочу протестировать PHPUnit
Ответ №1:
В FileNavigate.php файл используйте phpdoc: Важный комментарий принимает форму:
/** @var IBase */ private $f3;
или
/** @param IBase $f3 */ private $f3;
нет
/* lt;= bad form * @var IBase */ private $f3;
может быть, именно поэтому ваша среда разработки не может видеть типы