Я пытаюсь провести модульное тестирование класса mapper с помощью PHPUnit.
Я могу легко смоделировать экземпляр PDO, который будет внедрен в класс mapper, но я не могу понять, как смоделировать класс PreparedStatement, поскольку он генерируется классом PDO.
В моем случае я расширил класс PDO, поэтому у меня есть это:
public function __construct($dsn, $user, $pass, $driverOptions)
{
//...
parent::__construct($dsn, $user, $pass, $driverOptions);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS,
array('Core_Db_Driver_PDOStatement', array($this)));
}
Дело в том, что Core_Db_Driver_PDOStatement не внедряется в конструктор класса PDO, он создается статически. И даже если я сделаю это:
public function __construct($dsn, $user, $pass, $driverOptions, $stmtClass = 'Core_Db_Driver_PDOStatement')
{
//...
parent::__construct($dsn, $user, $pass, $driverOptions);
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS,
array($stmtClass, array($this)));
}
... это все еще статичный экземпляр, так как я не могу передать свой собственный смоделированный экземпляр подготовленного класса операторов.
Есть идеи?
Edit:
Решение, адаптированное от ответа:
/**
* @codeCoverageIgnore
*/
private function getDbStub($result)
{
$STMTstub = $this->getMock('PDOStatement');
$STMTstub->expects($this->any())
->method('fetchAll')
->will($this->returnValue($result));
$PDOstub = $this->getMock('mockPDO');
$PDOstub->expects($this->any())
->method('prepare')
->will($this->returnValue($STMTstub));
return $PDOstub;
}
public function testGetFooById()
{
$arrResult = array( ... );
$PDOstub = $this->getDbStub($arrResult);
}