Класс Mocking PDOException не отвечает

Я пишу модульный тест, чтобы имитировать ужасную ошибку MySql, которая исчезла, но у меня проблема с корректным реагированием моего фиктивного объекта. Может кто-то увидит, что я делаю не так.

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();
}

2

Решение

Так что я понял это. Базовый класс исключений объявляет 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 каждый день. Комментарии о том, почему это плохая идея, приветствуются.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]