PHPStan
PHPUnit
Это расширение предоставляет следующие возможности:
Методы createMock()
, getMockForAbstractClass()
и getMockFromWsdl()
возвращают тип пересечения (см. подробное объяснение типов пересечения) фиктивного объекта и фиктивного класса, так что оба метода из фиктивного объекта (например, expects
) и из фиктивного класса имеются на объекте.
Также поддерживается getMock()
вызываемый в MockBuilder
.
Интерпретирует Foo|PHPUnit_Framework_MockObject_MockObject
в phpDoc так, что в результате получается тип пересечения вместо типа объединения.
Определяет вызовы методов раннего завершения для класса PHPUnitFrameworkTestCase
, чтобы предотвратить ошибки неопределенных переменных.
Указывает типы выражений, передаваемых в различные методы assert
такие как assertInstanceOf
, assertTrue
, assertInternalType
и т. д.
В сочетании с уровнем PHPStan 4 он указывает на всегда истинные и всегда ложные утверждения, такие как assertTrue(true)
и т. д.
Он также содержит строгие правила, специфичные для платформы (можно включить отдельно):
Убедитесь, что вы не используете assertSame()
с ожидаемым значением true
. Вместо этого следует использовать assertTrue()
.
Убедитесь, что вы не используете assertSame()
с ожидаемым значением false
. Вместо этого следует использовать assertFalse()
.
Убедитесь, что вы не используете assertSame()
с null
ожидаемым значением. Вместо этого следует использовать assertNull()
.
Убедитесь, что вы не используете assertSame()
со вторым параметром count($variable)
. Вместо этого следует использовать assertCount($variable)
.
Если вам нужно настроить макет даже после того, как вы присвоили его свойству или вернули из метода, вам следует добавить PHPUnit_Framework_MockObject_MockObject
в phpDoc:
/** * @return Foo&PHPUnit_Framework_MockObject_MockObject */private function createFooMock() { return $this->createMock(Foo::class); }публичная функция testSomething() { $fooMock = $this->createFooMock(); $fooMock->method('doFoo')->will($this->returnValue('test')); $fooMock->doFoo(); }
Обратите внимание, что правильный синтаксис для типов пересечений — Foo&PHPUnit_Framework_MockObject_MockObject
. Foo|PHPUnit_Framework_MockObject_MockObject
также поддерживается, но только по причинам экосистемы и наследия.
Если макет полностью настроен и для значения должны вызываться только методы имитируемого класса, можно ввести подсказку только для имитируемого класса:
/** @var Foo */private $foo;защищенная функция setUp() { $fooMock = $this->createMock(Foo::class); $fooMock->method('doFoo')->will($this->returnValue('test')); $this->foo = $fooMock; }публичная функция testSomething() { $this->foo->doFoo(); // $this->foo->method() и ожидаемые() больше нельзя вызывать}
Чтобы использовать это расширение, запросите его в Composer:
composer require --dev phpstan/phpstan-phpunit
Если вы также установите phpstan/extension-installer, то все готово!
Если вы не хотите использовать phpstan/extension-installer
, включите Extension.neon в конфигурацию PHPStan вашего проекта:
includes: - vendor/phpstan/phpstan-phpunit/extension.neon
Для выполнения проверок, специфичных для платформы, включите также этот файл:
- vendor/phpstan/phpstan-phpunit/rules.neon