Нужно ли закрывать неиспользованные подготовленные заявления? - PullRequest
1 голос
/ 11 марта 2019

Я разработал какой-то конструктор запросов и написал несколько тестов, чтобы проверить, правильно ли QueryBuilder создает правильные запросы.

Итак, у меня есть набор самописных запросов, которые являются ожидаемыми запросами, которые QueryBuilder должен выдавать.

По моему мнению, недостаточно просто сравнивать эти запросы, но также проверять, скомпилированы ли эти запросы базовой СУБД.

Следовательно, я использую PDO::Prepare (пока EmulationMode = off!), Чтобы СУБД проверила мои ожидаемые запросы.

Этот тест PHPUnit довольно прост:

/**
 * @dataProvider provideExpectedSQLResults
 */
public function testExpectedSQLResults(string $sql)
{
    $this->getPdo()->prepare($sql);
}

Таким образом, я могу даже проверить, правильно ли мой QueryBuilder (не) именовал параметры.

Теперь мой вопрос:

Должен ли я "очистить" все эти открытые подготовленные заявления?

1 Ответ

0 голосов
/ 11 марта 2019

Как я уже сказал в комментариях.

Я думаю, вы путаете соединение с открытой базой данных с подготовленным заявлением. Для подготовленного оператора 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

Надеюсь, это поможет.

...