Yii framework 2. Как определить были ли запросы к базе данных
Не так давно писал тесты для одного приложения на Yii2 и возникла необходимость проверить, что, в результате работы метода, данные возвращаются из identity map
, а не из базы данных. Задача оказалась достаточно тривиальной, но, все же, поделюсь своим решением.
Как известно, любое приложение (как консольное, так и веб) содержит компонент логгирования yii\log\Logger
. Именно через него и можно получить все необходимые данные для проверки.
Получить компонент логирования можно прямя от глобального класса Yii, вызвав статичный метод getLogger
. Логгер содержит массу наиполезнейших возможностей, но для решения задачи нам потребуется метод getDbProfiling
. Он возвращает статистику результатов выполнения запросов к БД в виде массива, где первый (то есть нулевой) элемент содержит количество выполненных запросов, а второй - суммарное время их выполнения.
Зная это, можно за пару минут набросать метод, который возвращает количество выполненных запросов к БД. Привожу его ниже.
protected function getQueryCount() { $logger = Yii::getLogger(); // Получаем логгер if ($logger === null) { $this->markTestSkipped('I has no logger'); // Если он по какой-то причине отсутствует, то помечаем тест пропущенным } return $logger->getDbProfiling()[0]; // Возвращаем количество запросов }
Далее достаточно просто сравнить результат работы данного метода в нужных точках теста.
Вот и все.
А, нет! Тесты могут тебя спасти или погубить. Разница лишь в том, есть они или нет.