PhpUnit Как проверить метод double, используя как другие методы класса, так и методы собственного класса? - PullRequest
0 голосов
/ 27 января 2020

Итак, я хочу проверить двойную функцию doEverything так:

class MyClass {

    protected secondClass;

    public function __construct(
        SecondClass $secondClass;
    ) {
        $this->secondClass = $secondClass;
    }

    public function doEverything() : void {

        $this->secondClass->doSomethingSecondClass();
        $this->doSomething();

    }

    public function doSomething(): void {
        // do something, return nothing
    }
}

И соответствующий тест, который я пытаюсь использовать, выглядит следующим образом:

class MyClassTest extends TestCase
{
    protected $secondClass;

    protected $myClass;

    public function setUp() : void
    {
                $this->secondClass = $this->getMockBuilder(SecondClass::class)
                                         ->disableOriginalConstructor()
                                         ->setMethods(
                                             [
                                                 'doSomethingSecondClass'
                                             ]
                                         )
                                         ->getMock();

        $this->myClass = $this->getMockBuilder(MyClass::class)
                                   ->setConstructorArgs([$this->secondClass])
                                   ->setMethods(
                                       [
                                           'doEverything',
                                           'doSomething'
                                       ]
                                   )
                                   ->getMock();
    }

    public function testDoEverything(): void
    {
            $this->secondClass->expects($this->once())->method('doSomethingSecondClass');
            $this->myClass->expects($this->once())->method('doSomething');

            $this->myClass->doEverything();
    }

}

Это выше возвращаемое значение мне, что doSomethingSecondClass никогда не вызывается в методе doEverything из MyClass. Думаю, я могу использовать $ this-> myClass-> Ожидает без проблем.

И следующий тестовый код:

class MyClassTest extends TestCase
{
    protected $secondClass;

    protected $myClass;

    public function setUp() : void
    {
                $this->secondClass = $this->getMockBuilder(SecondClass::class)
                                         ->disableOriginalConstructor()
                                         ->setMethods(
                                             [
                                                 'doSomethingSecondClass'
                                             ]
                                         )
                                         ->getMock();

                        $this->saveMultiple = new SaveMultiple(
                                     $this->resourceConnection
                                 );
    }

    public function testDoEverything(): void
    {
            $this->secondClass->expects($this->once())->method('doSomethingSecondClass');
            $this->myClass->expects($this->once())->method('doSomething');

            $this->myClass->doEverything();
    }

}

Приведенный выше код говорит мне, что myClass не может использоваться с функцией ожидает из phpUnit, но doSomethingSecondClass вызывается, как и ожидалось.

Итак, по вашему мнению, как мне приступить к тестированию этого метода?

Спасибо!

1 Ответ

0 голосов
/ 27 января 2020

secondClass никогда не используется, потому что вы используете макет для myClass. В макете вы никогда не называете secondClass. Правильный способ проверить это - не использовать макет для myClass, а вместо этого создавать его реальный экземпляр.

...