jangregor/phpstan-prophecy
PHPStan extension for phpspec/prophecy that improves type inference in tests. It teaches PHPStan the real types returned from Prophecy workflows like prophesize(), willExtend(), and reveal(), so your revealed doubles are understood as the mocked class.
Provides a phpspec/prophecy extension for phpstan/phpstan.
Run
composer require --dev jangregor/phpstan-prophecy
When using phpstan/extension-installer, no further setup is required.
When not using phpstan/extension-installer, extension.neon needs to be included in phpstan.neon:
includes:
+ - vendor/jangregor/phpstan-prophecy/extension.neon
prophesize() and reveal()<?php
use PHPUnit\Framework;
final class ExampleTest extends Framework\TestCase
{
public function testSomething(): void
{
$prophecy = $this->prophesize(SomeModel::class);
$testDouble = $prophecy->reveal();
// ...
}
}
:bulb: With this extension enabled, phpstan/phpstan will understand that $testDouble is an instance of SomeModel.
prophesize(), willExtend(), and reveal()<?php
use PHPUnit\Framework;
final class ExampleTest extends Framework\TestCase
{
public function testSomething(): void
{
$prophecy = $this->prophesize()->willExtend(SomeModel::class);
$testDouble = $prophecy->reveal();
// ...
}
}
:bulb: With this extension enabled, phpstan/phpstan will understand that $testDouble is an instance of SomeModel.
prophesize(), willImplement(), and reveal()<?php
use PHPUnit\Framework;
final class ExampleTest extends Framework\TestCase
{
public function testSomething(): void
{
$prophecy = $this->prophesize(SomeModel::class)->willImplement(SomeInterface::class);
$testDouble = $prophecy->reveal();
// ...
}
}
:bulb: With this extension enabled, phpstan/phpstan will understand that $testDouble is an instance of SomeModel that also implements SomeInterface.
<?php
use PHPUnit\Framework;
final class ExampleTest extends Framework\TestCase
{
public function testSomething(): void
{
$prophecy = $this->prophesize(SomeModel::class);
$prophecy
->doubleTheNumber(Argument::is(2))
->willReturn(4);
$testDouble = $prophecy->reveal();
// ...
}
}
:bulb: With this extension enabled, phpstan/phpstan will understand that $prophecy accepts method calls to all methods that are implemented by its prophesized class (or additionally implemented interfaces, when using willImplement()).
:exclamation: Currently here are no checks in place to validate the arguments of methods that are invoked on prophecies.
A development environment is provided via .docker/Dockerfile.
Run
$ docker build --tag phpstan-prophecy .docker/
to build and tag the Docker image.
Run
$ docker run -it --rm --volume "$PWD":/var/www/html --workdir /var/www/html phpstan-prophecy bash
to open a shell in the Docker container.
Please have a look at CHANGELOG.md.
Please have a look at CONTRIBUTING.md.
This package is licensed using the MIT License.
Please have a look at LICENSE.md.
How can I help you explore Laravel packages today?