gpt4 book ai didi

php - 模拟 PDOException 类无法响应

转载 作者:行者123 更新时间:2023-11-29 01:56:36 25 4
gpt4 key购买 nike

我正在编写一个单元测试来模拟可怕的 MySql has gone away 错误,但是我在让我的模拟对象正确响应时遇到了问题。也许有人可以看出我做错了什么。

private function getMockGoneAway()
{
$e = $this->getMockBuilder('PDOException')
->disableOriginalConstructor()
->setMethods([
'getMessage',
'getCode',
])
->getMock();

$e->expects($this->any())
->method('getMessage')
->willReturn('SQLSTATE[HY000]: General error: 2006 MySQL server has gone away');

$e->expects($this->any())
->method('getCode')
->willReturn('HY000');

return $e;
}

这是测试。问题是无论它发生在哪里,我都无法获得模拟异常以从 getMessage 或 getCode 返回预期结果。

public function testBeginTransactionGoneAway()
{
// get a mock PDO object that overrides beginTransaction method
$mock_pdo = $this->getMockPdo(['beginTransaction']);

// grab a mock gone-away exception object
$mock_gone_away_exception = $this->getMockGoneAway();

die("MSG: ".$mock_gone_away_exception->getMessage());

// setup mock pdo responses
$mock_pdo->expects($this->once())
->method('beginTransaction')
->will($this->throwException($mock_gone_away_exception));

$this->db->replaceConnection($mock_pdo);
$this->db->begin();
}

最佳答案

所以我想通了。基异常类将 getMessage 和 getCode 声明为 final。出于某种原因,PHPUnit 没有让您知道它无法覆盖这些方法。因此,与模拟 PDO 类一样,您也需要手动模拟 PDOException 类。

class MockPDOException extends \PDOException
{
public function __construct($msg, $code) {
$this->message = $msg;
$this->code = $code;
}
}

现在可以正确模拟异常了

$mock_gone_away_exception = new MockPDOException('SQLSTATE[HY000]: General error: 2006 MySQL server has gone away','HY000');

// setup mock pdo responses
$mock_pdo->expects($this->once())
->method('beginTransaction')
->will($this->throwException($mock_gone_away_exception));

所以这很有趣。每天学习更多关于 PHPUnit 的知识。欢迎评论为什么这是一个坏主意。

关于php - 模拟 PDOException 类无法响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27285164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com