Удаление зависимости в конструкторе с помощью PHPunit
-
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
.