Как я уже сказал в комментариях.
Я думаю, вы путаете соединение с открытой базой данных с подготовленным заявлением. Для подготовленного оператора PDO возвращает объект PDOStatment, для которого необходимо вызвать execute. На самом деле PDO даже не имеет метода execute.
http://php.net/manual/en/class.pdo.php
Кроме того, нет такой вещи, как открытое или закрытое подготовленное заявление.
В вашем примере код:
public function testExpectedSQLResults(string $sql)
{
$this->getPdo()->prepare($sql);
}
Это, по существу, спорное (если вы не просто делаешь это бросить исключение, которое до сих пор в основном спорный вопрос ниже), как вы никогда не можете выполнить этот запрос, потому что вы не возвращаете объект PDOStatment, что на самом деле имеет метод выполнения.
В случае соединения с БД, как правило, вам не нужно беспокоиться об этом либо
Для тестирования PDO::prepare
возвращает логическое значение false или выдает исключение в зависимости от того, как его настроить. Параметризованные данные не существуют (как правило) в исходном коде. Это зависит от состояния приложения при его запуске. Входные данные, если вы будете. Без этого невозможно реально проверить это.
В основном то, что вы делаете выше, это просто проверка синтаксиса вашего SQL, который обычно будет хорошим или плохим и не будет сильно меняться в зависимости от пользовательского ввода. Даже динамические запросы будут либо работать, либо нет, потому что ваш SQL будет синтаксически правильным или нет. Если это не так, вам придется изменить код, который его генерирует, что-то, что вы обнаружите при разработке.
Модульное тестирование - это другое дело, если вы используете что-то вроде PHPUnit . Где вы можете использовать фиксаторы и макеты для входных данных и т. Д. Это больше для тестирования вашего кода с известными вариантами использования, так что, если вы сделаете здесь изменение кода, вы внезапно не столкнетесь с ошибкой там. И так далее. Это то, что вы можете посмотреть на это. Вы не упомянули об этом в вопросе, поэтому я предположил, что вы не используете его.
В PHPUnit вы можете проверить, генерирует ли этот метод тестирования конкретное исключение, например, например, с помощью аннотации:
/**
* @expectedException \PDOException
*/
https://phpunit.readthedocs.io/en/8.0/index.html
Надеюсь, это поможет.