При попытке протестировать устаревшую кодовую базу я наткнулся на объект, который выполняет следующие действия:
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 () возвращает нуль.
Есть ли способ отсоединить эту зависимость без необходимости рефакторинга того, как класс использует конструкторы?