@driverx18

Как замокать результаты метода, чтобы он не делал API call?

есть ситуация, есть метод, который я хочу протестировать, есть метод:

public function getPaidShops() : array
    {
        $categories = $this->getCategories();

        $data = $this->getLicense($categories);

        return $this->format($data);
    }


всё бы хорошо, но вот тут вызывается метод getLicense который делает API call. Внутри него происходит такое:
private function getLicense(array $categories)
    {
        return app(APIService::class)->getLicenses($categories);
    }


Я хотел бы, чтобы этот метод не лез в апишку (тем более оно вызвать ее не может из тестов, потому что выдается ошибка, что session не установлена), а хотел бы конкретно замокать этот метод. Как это можно сделать?
Как вариант, можно переписать код, чтобы в тестируемый класс в конструктор передавался APIService (а не создавался напрямую в методе), и в юнит тестах в конструктор передавать мок этого класса с данными которые подкинутся в getLicenses из дата провайдера
Но переписывать код не хотелось бы и заменять во всех местах проекта, может есть какие-то еще варианты решения?
  • Вопрос задан
  • 194 просмотра
Пригласить эксперта
Ответы на вопрос 1
rpsv
@rpsv
делай либо хорошо, либо никак
Метод getLicense сделайте protected и для теста наследуйтесь от основного класса и подменяйте метод getLicense.
Тогда вообще ничего переписывать не придется.
public function testCase()
{
    $mockObject = $this->createMock(NeedClass::class);
    // чем это принципиально отличается от мока с точки зрения теста - непонятно
    $mockObject = new class extends NeedClass {
        protected function getLicense(array $categories)
        {
            return 'need license';
        }
    };

    $this->assertEqual($mockObject->getPaidShops(), 'actual value');
}


Как вариант, можно переписать код, чтобы в тестируемый класс в конструктор передавался APIService (а не создавался напрямую в методе), и в юнит тестах в конструктор передавать мок этого класса с данными которые подкинутся в getLicenses из сервис провайдера

Ну вообще так и надо сделать, DI все дела :)
Ответ написан
Ваш ответ на вопрос

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

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