Twitt
@Twitt

Как покрыть подобный метод юнит тестом?

Есть метод, который нужно покрыть юнит тестом. Суть его такова: на вход ему приходит $clientId, сам метод делает
try {
            $data = $this->read($clientId);
        }
        catch (\Exception $exception) {
            // тут обработка эксепшена
        }

т.е. он идет в БД и ищет этот clientId, в ином случае кидается эксепшн. Вопрос, как ему подкинуть корректный clientId в юнит тесте в дата провайдере? Ведь если я укажу существующие сейчас clientId СТАТИЧЕСКИ, и с ними пройдут юнит тесты, и когда то удалят эти clientId из БД, то юнит тесты зафейлятся. Как быть в таких ситуациях? Мне нужно в юнит тесте сходить в бд, и выбрать те clientId, которые существуют, и их прокинуть в датапровайдер? Как сделать это по умному?
  • Вопрос задан
  • 90 просмотров
Решения вопроса 2
@green_goo
Ведь если я укажу существующие сейчас clientId, и с ними пройдут юнит тесты, и когда то удалят эти clientId из БД, то юнит тесты зафейлятся

Юнит тесты ходят в реальную бд? Это неправильно.
Нужно заменять в тесте слой взаимодействия с бд заглушкой, которая будет возвращать нужные данные, либо для тестов своя бд, где перед тестом она заполняется нужными данными
Ответ написан
@heahoh
Full stackoverflow developer
Сделайте мок тестируемого сервиса, переопределите методы, которые находятся в тестируемом методе, но нет необходимости их тестировать, верните ожидаемое для тестового сценария значение:
$serivceMock = $this->getMockBuilder(Service::class)
            ->setMethods(['read',])
            ->getMock();
$serviceMock->expects($this->once())
            ->method('read')
            ->willReturn($preparedResult);
$serviceMock->execute($clientId);
// there is checks about work with preparedResult

Или, например, при проверке ситуации с ненайденным пользователем
$serivceMock = $this->getMockBuilder(Service::class)
            ->setMethods(['read',])
            ->getMock();
$serviceMock->expects($this->once())
            ->method('read')
            ->willThrowException(new NotFoundException());
$serviceMock->execute($clientId);
// there is checks about work with not found exception
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Алгоритмика Москва
от 110 000 до 160 000 руб.
Лучшие люди Иваново
от 40 000 до 90 000 руб.
N1.RU Новосибирск
от 100 000 руб.