Удаление зависимости в конструкторе с помощью PHPunit

StackOverflow https://stackoverflow.com/questions/1427738

  •  07-07-2019
  •  | 
  •  

Вопрос

При попытке протестировать устаревшую кодовую базу я наткнулся на объект, который выполняет следующие действия:

class Foo
{
    public function __construct($someargs)
    {
        $this->bar = new Bar();
        // [lots more code]
    }
}

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

class Foo
{
    public function __construct($someargs)
    {
        $this->bar = $this->getBarInstance();
        // [lots more code]
    }

    protected function getBarInstance()
    {
        return new Bar();
    }
}

И попытались проверить его с помощью следующего теста PHPUnit:

class FooTest extends PHPUnit_Framework_TestCase
{
    public function testInstance()
    {

        $bar = $this->getMock('Bar');
        $foo = $this->getMock('Foo', array('getBarInstance'));
        $foo->expects($this->any())
            ->method('getBarInstance')
            ->will($this->returnValue($bar));

    }

}

Однако это не сработает - конструктор Foo () вызывается до того, как добавлен my - > Expected (), поэтому смоделированный метод getBarInstance () возвращает ноль.

Есть ли способ отсоединить эту зависимость без необходимости рефакторинга того, как класс использует конструкторы?

Это было полезно?

Решение

Используйте аргумент $ callOriginalConstructor для getMock () . Установите для него значение false . Это пятый аргумент метода. Посмотрите его здесь: http: // www .phpunit.de / ручной / ток / EN / api.html # api.testcase.tables.api

На самом деле, держись. Вы хотите передать макет макету? Если вы действительно этого хотите, то используйте третий аргумент getMock , который представляет аргументы конструктора. Там вы можете передать макет Bar на макет Foo .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top