Skip to content

Jan0707/phpstan-prophecy

Folders and files

NameName
Last commit message
Last commit date
Feb 29, 2020
May 8, 2020
Mar 1, 2020
Mar 1, 2020
Feb 26, 2020
Mar 1, 2020
Feb 29, 2020
Feb 29, 2020
Mar 1, 2020
Feb 5, 2020
Mar 1, 2020
May 8, 2020
May 8, 2020
May 8, 2020
Mar 1, 2020
Mar 1, 2020
Mar 1, 2020
Mar 1, 2020
Mar 1, 2020
Feb 29, 2020

Repository files navigation

phpstan-prophecy

Integrate

Latest Stable Version Total Downloads

Violinist Enabled

Provides a prophecy/prophecy extension for phpstan/phpstan.

Installation

Run

$ composer require --dev jangregor/phpstan-prophecy

Configuration

Automatic

When using phpstan/extension-installer, no further setup is required.

Manual

When not using phpstan/extension-installer, extension.neon needs to be included in phpstan.neon:

 includes:
+	- vendor/jangregor/phpstan-prophecy/extension.neon

Usage

prophesize() and reveal()

<?php

use PHPUnit\Framework;

final class ExampleTest extends Framework\TestCase
{
    private $prophecy;

    protected function setUp()
    {
        $this->prophecy = $this->prophesize(SomeModel::class);
    }

    public function testSomething(): void
    {
        $prophecy = $this->prophesize(SomeModel::class);

        $testDouble = $prophecy->reveal();

        // ...
    }

    public function testSomethingElse(): void
    {
        $testDouble = $this->prophecy->reveal();

        // ...
    }

    public function testSomethingDifferent(): void
    {
        $testDouble = $this->createProphecy()->reveal();

        // ...
    }

    private function createProphecy()
    {
        return $this->prophesize(SomeModel::class);
    }

}

πŸ’‘ 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
{
    private $prophecy;

    protected function setUp()
    {
        $this->prophecy = $this->prophesize()->willExtend(SomeModel::class)
    }

    public function testSomething(): void
    {
        $prophecy = $this->prophesize()->willExtend(SomeModel::class);

        $testDouble = $prophecy->reveal();

        // ...
    }

    public function testSomethingElse(): void
    {
        $testDouble = $this->prophecy->reveal();

        // ...
    }

    public function testSomethingDifferent(): void
    {
        $testDouble = $this->createProphecy()->reveal();

        // ...
    }

    private function createProphecy()
    {
        return $this->prophesize(SomeModel::class)->willExtend(SomeInterface::class);
    }
}

πŸ’‘ 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
{
    private $prophecy;

    protected function setUp()
    {
        $this->prophecy = $this->prophesize(SomeModel::class)->willImplement(SomeInterface::class);
    }

    public function testSomething(): void
    {
        $prophecy = $this->prophesize(SomeModel::class)->willImplement(SomeInterface::class);

        $testDouble = $prophecy->reveal();

        // ...
    }

    public function testSomethingElse(): void
    {
        $testDouble = $this->prophecy->reveal();

        // ...
    }

    public function testSomethingDifferent(): void
    {
        $testDouble = $this->createProphecy()->reveal();

        // ...
    }

    private function createProphecy()
    {
        return $this->prophesize(SomeModel::class)->willImplement(SomeInterface::class);
    }
}

πŸ’‘ With this extension enabled, phpstan/phpstan will understand that $testDouble is an instance of SomeModel that also implements SomeInterface.

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();

        // ...
    }
}

πŸ’‘ 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()).

Method Arguments

❗ Currently here are no checks in place to validate the arguments of methods that are invoked on prophecies.

Development

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.

Changelog

Please have a look at CHANGELOG.md.

Contributing

Please have a look at CONTRIBUTING.md.

License

This package is licensed using the MIT License.

Please have a look at LICENSE.