Как ожидать точного макета в качестве аргумента вызова метода, а не какого-либо макета того же класса в PHPUnit? - PullRequest
0 голосов
/ 28 декабря 2018

В приведенном ниже примере (с использованием PHP 7.3 и PHPUnit 7.5.1) у меня есть два макета одного и того же класса.Я хочу ожидать одного из двух макетов в качестве аргумента в вызове метода.Но ожидание, похоже, оправдается, если я вызову метод с другим макетом.

<?php declare(strict_types=1);

use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase
{
    public function testExample()
    {
        $mock1 = $this->getMockBuilder(stdClass::class)->getMock();
        $mock2 = $this->getMockBuilder(stdClass::class)->getMock();
        /** @var MockObject|ArrayObject $mock3 */
        $mock3 = $this->getMockBuilder(ArrayObject::class)->setMethods(['append'])->getMock();

        $this->assertEquals($mock1, $mock2); // OK
        $this->assertNotSame($mock1, $mock2); // OK

        $mock3->expects($this->once())->method('append')->with($mock1); // OK

        // However I pass $mock2 instead of $mock1 !
        $mock3->append($mock2);

        // I would need something like :
        // $mock3->expects($this->once())->method('append')->withSameAs($mock1); // Not OK
    }
}

1 Ответ

0 голосов
/ 29 декабря 2018

Я думаю, что вы хотели вызвать функцию $this->identicalTo в функции with.Это проверит, что правильный объект был передан.Если вы обновите код для передачи в $mock1, он не сможет работать, потому что объекты не совпадают

use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

    class ExampleTest extends TestCase
    {
        public function testExample()
        {
            $mock1 = $this->getMockBuilder(stdClass::class)->getMock();
            $mock2 = $this->getMockBuilder(stdClass::class)->getMock();
            /** @var MockObject|ArrayObject $mock3 */
            $mock3 = $this->getMockBuilder(ArrayObject::class)
                ->setMethods(['append'])->getMock();

            $mock3->expects($this->once())->method('append')->with($this->identicalTo($mock2)); // OK
            $mock3->append($mock2);

        }
    }

Другой Пример:

use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

class ExampleTest extends TestCase
{
    public function testExample()
    {
        $mock1 = $this->getMockBuilder(stdClass::class)->getMock();
        $mock2 = $this->getMockBuilder(stdClass::class)->getMock();
        /** @var MockObject|ArrayObject $mock3 */
        $mock3 = $this->getMockBuilder(ArrayObject::class)
            ->setMethods(['append'])->getMock();  

        $class = new ExampleClass($mock3);
        $mock3->expects($this->once())->method('append')->with($this->identicalTo($mock2)); // OK
        $class->appendObject($mock2);

    }
}

class ExampleClass
{
    private $array;

    public function __construct(ArrayObject $array)
    {
        $this->array = $array;
    }

    public function appendObject($stdClass)
    {
        $this->array->append($stdClass);
    }
}
...