phpstan-prophecy
, (*1)
, (*2)
, (*3)
Provides a phpspec/prophecy extension for phpstan/phpstan., (*4)
Installation
Run, (*5)
composer require --dev jangregor/phpstan-prophecy
Configuration
Automatic
When using phpstan/extension-installer, no further setup is required., (*6)
Manual
When not using phpstan/extension-installer, extension.neon needs to be included in phpstan.neon:, (*7)
 includes:
+   - vendor/jangregor/phpstan-prophecy/extension.neon
Usage
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., (*8)
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., (*9)
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., (*10)
Method Predictions
<?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())., (*11)
Method Arguments
:exclamation: Currently here are no checks in place to validate the arguments of methods that are invoked on prophecies., (*12)
Development
A development environment is provided via .docker/Dockerfile., (*13)
Run, (*14)
$ docker build --tag phpstan-prophecy .docker/
to build and tag the Docker image., (*15)
Run, (*16)
$ docker run -it --rm  --volume "$PWD":/var/www/html --workdir /var/www/html phpstan-prophecy bash
to open a shell in the Docker container., (*17)
Changelog
Please have a look at CHANGELOG.md., (*18)
Contributing
Please have a look at CONTRIBUTING.md., (*19)
License
This package is licensed using the MIT License., (*20)
Please have a look at LICENSE.md., (*21)