【发布时间】:2016-06-13 22:57:09
【问题描述】:
我正在编写一个基本的 PDO 包装类,当我想在单元测试中使用 willThrowException() 和 PDOException 的模拟来模拟 PDOStatement::prepare() 抛出异常时,getMessage() 的返回值是总是和空字符串,而不是我设置的。
这是我的尝试:
// WrapperClass.php
<?php
class WrapperClass
{
private $pdo;
private $error = '';
public function __construct(\PDO $pdo)
{
$this->pdo = $pdo;
}
public function save()
{
$sql = 'INSERT INTO ...';
try {
$this->pdo->prepare($sql);
// some value binding and executing the statement
} catch (\PDOException $pdoException) {
$this->error = $pdoException->getMessage();
}
}
public function getError()
{
return $this->error;
}
}
和我的测试:
// WrapperClassTest.php
<?php
class WrapperClassTest extends \PHPUnit_Framework_TestCase
{
/**
* @test
*/
public function save_saves_PDOException_message_in_error_property()
{
$pdoMock = $this->getMockBuilder('WrapperClass')
->disableOriginalConstructor()
->setMethods(['prepare'])
->getMock();
$pdoMock->expects($this->once())
->method('prepare')
->willThrowException($pdoExceptionMock);
$pdoExceptionMock = $this->getMockBuilder('\PDOException')
->setMethods(['getMessage'])
->getMock();
$message = 'Message from PDOException';
$pdoExceptionMock->expects($this->once())
->method('getMessage')
->willReturn($message);
$wrapperClass = new WrapperClass($pdoMock);
$wrapperClass->save();
$this->assertEquals($message, $wrapperClass->getError());
}
}
我也尝试将->willThrowException($pdoException) 替换为->will($this->throwException($pdoException)),但它不起作用。
我注意到,如果我将 ->willThrowException($pdoException) 替换为 ->willThrowException(new \PDOException('Message from PDOException')) 它可以工作,但是我依赖于 PDOException 类而不是模拟它。
有什么想法吗?
【问题讨论】:
-
愚蠢的想法,但声明的顺序重要吗?您告诉它抛出 pdoExceptionMock,但在将数据分配给您的 pdoMock 后填充数据。
标签: php exception mocking phpunit