@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()

Такое вообще возможно провернуть?
Или же я пытаюсь тестировать то что не должен тестировать таким способом или изначально архитектура не подходящие под такое тестирование?
  • Вопрос задан
  • 341 просмотр
Пригласить эксперта
Ответы на вопрос 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,
                ]);
        });
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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