PHPUnit - макет метода использования класса созданного экземпляра - PullRequest
0 голосов
/ 04 мая 2018

Я хочу смоделировать метод foo в классе, но оставить метод bar как есть:

<?php

class MyClass
{
    protected $dep1;
    protected $dep2;
    protected $dep3;
    protected $dep4;

    /**
     * Test constructor.
     * @param $dep1
     * @param $dep2
     * @param $dep3
     * @param $dep4
     */
    public function __construct($dep1, $dep2, $dep3, $dep4)
    {
        $this->dep1 = $dep1;
        $this->dep2 = $dep2;
        $this->dep3 = $dep3;
        $this->dep4 = $dep4;

        parent::__construct();
    }

    public function foo()
    {
        return "foo";
    }

    public function bar()
    {
        return "bar";
    }
}

Однако, MyClass создается через фабрику, которая извлекает зависимости ($dep1, $dep2, ...) и вставляет их непосредственно в конструктор MyClass. Поэтому я хочу использовать эту Фабрику и создать экземпляр объекта MyClass (в противном случае сложный экземпляр должен быть закодирован и в тестовом примере).

Короче говоря, я хочу знать, есть ли другое решение, чем:

class TestMyClass extends \PHPUnit\Framework\TestCase {
    public function setUp()
    {
        // complicated way to retrieve $dep1 to $dep4

        $mock = $this->getMockBuilder(MyClass::class)->setMethods(['foo'])->setConstructorArgs([$dep1, $dep2, $dep3, $dep4])->getMock();
        $mock->expects($this->any())->method('foo')->willReturn(false);
    }
}

Можно ли каким-то образом создать прокси для уже созданного экземпляра MyClass, который просто переопределяет метод foo? Есть ли другой способ (без расширения pek runkit) для насмешки метода существующего / созданного объекта?

Я знаю, что в PHPUnit есть некоторые Proxy связанные методы, но я не смог найти какую-либо документацию / пример их использования, поэтому я не уверен, могут ли они вообще использоваться для решения моей проблемы.

...