【发布时间】:2011-07-17 09:16:56
【问题描述】:
我正在尝试使用 PHPUnit 对映射器类进行单元测试。 我可以轻松地模拟将在映射器类中注入的 PDO 实例,但我不知道如何模拟 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)));
}
...它仍然是一个静态实例,因为我无法传递我自己的准备好的语句类的模拟实例。
有什么想法吗?
编辑: 解决方案,改编自anwser:
/**
* @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);
}
【问题讨论】:
标签: php mocking pdo phpunit prepared-statement