Кто как тестирует компоненты работающие с ActiveRecord?

Всё про тестирование в Yii 2.0
Ответить
rumasterov
Сообщения: 17
Зарегистрирован: 2013.01.18, 19:00

Кто как тестирует компоненты работающие с ActiveRecord?

Сообщение rumasterov »

Всем привет.

Такой вопрос, как правильно тестировать компоненты в которых есть выборки через ActiveRecord, вот простой пример:

Код: Выделить всё

<?php

class NotApprovedPostsNotifier
{
    private function sendMessage($posts)
    {
        // отправка сообщения модератору
    }
    
    public function notify()
    {
        $posts = Post::find()->notApproved()->all();
        
        if (is_array($posts) && count($posts) > 0) {
            $this->sendMessage($posts);
        }
    }
}
В методе sendMessage сообщение добавляются в очередь на отправку, сервис который этим занимается я могу без проблем замокать и вставить как зависимость через конструктор.

Меня смущает строка:

Код: Выделить всё

$posts = Post::find()->notApproved()->all();
И таких строк в кастомных компонентах может быть много. Как для этого всего написать чистый unit тест, который не затрагивает базу данных вообще не понимаю. Кто как с этим борется?

Можно запрос выборки вынести в отдельный метод класса, но опять же если я его сделаю приватным, то замокать не смогу, разве что сделать protected, но тогда я раскрываю часть реализации наследникам, а это не совсем уместно.

Я кроме как писать интеграционный тест с фикстурами выхода не вижу.

Опытные разработчики, подскажите пожалуйста как вы это решаете именно с ActiveRecord? А то я уже начинаю посматривать в сторону Doctrine, там бы вставил репозиторий как зависимость, замокал его и проблем не знал, но меня останавливает что уже много на ActiveRecord написано и переписывать как-то желания не особо много, может есть другой выход именно для ActiveRecord.
Последний раз редактировалось rumasterov 2016.12.11, 22:15, всего редактировалось 2 раза.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Кто как тестирует компоненты работающие с ActiveRecord?

Сообщение ElisDN »

Замените:

Код: Выделить всё

$posts = Post::find()->notApproved()->all(); 
аналогично на:

Код: Выделить всё

$posts = $this->postRepository->getNotApproved(); 
и мокайте.
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Кто как тестирует компоненты работающие с ActiveRecord?

Сообщение Loveorigami »

Кто не в теме "мокайте"- ударение на О. )))
Ответить