Twitt
@Twitt

По правильному ли я сделал unit test для удаления записи?

есть метод deleteAll, который вызывает delete метод, который просто лезет в базу и удаляет данные. delete() в случае успешного удаления должен возвращать 0. Так как я не хочу, чтобы при запуске юнит тестов данные действительно удалялись, я сделал такой подход:
public function testDeleteAll(array $list, $expected)
    {
        $modelMock = $this->getMockBuilder(Model::class)->setMethods(['delete'])->getMockForAbstractClass();
        $modelMock->method('delete')->willReturn(0);
        $this->assertEquals($expected, $modelMock->deleteAll($list));
    }

Правильно ли я сделал? Тесты проходят, но я не уверен, что оно работает правильно. Или нужно было поступить как то иначе? Просто, если я указываю в setMethods еще deleteAll то тесты фейлятся. Надо ли было еще его указывать?
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
maksim92
@maksim92
Нашел решение — пометь вопрос ответом!
Само удаление из базы тестируется, обычно, функциональными тестами. Unit тесты обычно не используют для работы с базой. Юнит тесты для этого и нужны, чтобы их запускать часто и чтобы они отрабатывали быстро. А в вашем случае сначала нужно создать фикстуры, потом удалить эти данные. Такой тест будет долго работать и запускать его не захочется.

Для этого даже делают наоборот. Создают репозиторий, а потом делают заглушку на сохранение, вставку и так далее. Чтобы не работать с базой.

Используйте для тестирования тогда codeception.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
21 окт. 2019, в 22:35
500 руб./за проект
21 окт. 2019, в 21:56
10000 руб./за проект
21 окт. 2019, в 21:06
600 руб./в час