Twitt
@Twitt

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

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

т.е. он идет в БД и ищет этот clientId, в ином случае кидается эксепшн. Вопрос, как ему подкинуть корректный clientId в юнит тесте в дата провайдере? Ведь если я укажу существующие сейчас clientId СТАТИЧЕСКИ, и с ними пройдут юнит тесты, и когда то удалят эти clientId из БД, то юнит тесты зафейлятся. Как быть в таких ситуациях? Мне нужно в юнит тесте сходить в бд, и выбрать те clientId, которые существуют, и их прокинуть в датапровайдер? Как сделать это по умному?
  • Вопрос задан
  • 99 просмотров
Решения вопроса 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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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