zetamen
@zetamen
В поисках нового

Механизм для модульного тестирования без базы данных?

В Yii2 для работы с базой данных используется ActiveRecord, который не поддается тестированию. Поэтому используем класс-обертку, который уже использует ActiveRecord, и который можно замокапить.

Теперь появляется вопрос, как сделать, чтобы mock-объект работал как ActiveRecord, то есть имел CRUD функции без использования базы данных?

Самым простым и быстрым решением видится механизм, использующий массивы.
Например, запрос

$exists = User::find()->where(['username' => $username])->exists()


заменялся бы функцией
(тривиальный пример)

function exists($name, $value)
{
    $user = null;
    foreach($dbUsers as $dbUser) {
        if ($dbUser[$name] == $value) {
            return true;
        }
    }
    return false;
}


Есть ли такие инструменты на php? И жизнеспособна ли идея в принципе?
  • Вопрос задан
  • 753 просмотра
Решения вопроса 2
@matperez
Чем вам не нравится вариант с частичными моками? Вам ведь нужно не CRUD как таковой протестировать, а корректную реакцию окружающего кода на то как ведет себя модель ActiveRecord. Мокайте методы CRUD, остальное пусть работает как есть.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Просто введите репозитории, и будет вам счастье. Внутри используйте AR, снаружи все будет чисто и красиво.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dmitriylanets
@dmitriylanets
веб-разработчик
Патерн репозиторий
в рабочем варианте
$PostRepository = new PostRepository($DBStorage);
при тестировании
$PostRepository = new PostRepository($MemoryStorage);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы