Советы PHP-разработчика

Блог содержащий короткие заметки касающиеся программирования для web.

Yii framework 2. Как определить были ли запросы к базе данных

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]; // Возвращаем количество запросов
}

Далее достаточно просто сравнить результат работы данного метода в нужных точках теста.

Вот и все.

А, нет! Тесты могут тебя спасти или погубить. Разница лишь в том, есть они или нет.

  • 2016-07-16 14:40:30