Задать вопрос
@rst630

Как подменить метод класса при тестирование laravel phpunit?

Есть класс ServiceApi.php - в его конструкторе создается guzzle клиент с дефолтными опциями:
$this->client = new Client($options);

в нем же есть метод:
public function fetch()
{
return $this->client->get('http://......')->getBody()->getContents();
}


И есть другой класс скажем ServiceUser.php - в нем есть метод который использует класс ServiceApi:
public function fetchFromApi()
{
return (new ServiceApi())->fetch();
}


в тесте я хочу что бы при вызове (new ServiceUser())->fetchFromApi() - клиент guzzle не обращался к реальному апи, а я заранее явно определил в тесте весь его ответ.

Пробовал мокать класс ServiceApi, но это работает только внутри теста, когда вызов происходит уже из ServiceUser то вызывается реальный метод fetch()

Такое вообще возможно провернуть?
Или же я пытаюсь тестировать то что не должен тестировать таким способом или изначально архитектура не подходящие под такое тестирование?
  • Вопрос задан
  • 380 просмотров
Подписаться 2 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
dostrog
@dostrog
можно, в связке с ларавель можно воспользоваться https://laravel.com/docs/8.x/http-client#testing

или мокнуть ваш класс (вот примерно так у меня )

$this->mock(RestApi::class, function (MockInterface $mock) use ($user) {
            $mock->shouldReceive('login')
                ->with($user->phone, $user->pass)
                ->andReturn([
                    'result' => ApiStatus::OK,
                ]);
        });
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы