Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Laravel 6/7/8/9/10 » unit test не мокается класс с construct » 09.03.2020 18:51:58

Medet
Ответов: 0

Добрый день. Суть проблемы, не мокается класс с использованием construct.

Собственно тестируемый метод:

    
private function getOrdersAndStatusesAllOrders($site)
    {
        $kaspiClient = app()->make(\App\Http\Kaspi\Client::class, ['site' => $site]);
        $ordersIdsAndStatuses = [];
        foreach($this->states() as $state){
            $orders = $kaspiClient->getNewOrders(['state' => $state]);
            $data = $this->getOrdersIdsAndStatuses($orders);
            $ordersIdsAndStatuses = array_merge($ordersIdsAndStatuses, $data);
        }
        return $ordersIdsAndStatuses;
    }

Необходимо замокать этот класс, как уже поняли необходимо в contruct передать ['state' => $state]:

        
$kaspiClient = app()->make(\App\Http\Kaspi\Client::class, ['site' => $site]);

Я пытаюсь замокать:

        $codeCorrect   = $this->faker->numberBetween(10000, 100000);
        $statusCorrect = $this->faker->word;
        $statusWrong   = $this->faker->word;

        $mockdata = (object)[
            0 => (object)[
                'attributes' => (object)[
                    'code'   => $codeCorrect,
                    'status' => $statusCorrect
                ]
            ]
        ];
        
        Mockery::mock(Client::class, function($mock) use ($mockdata) {
            $mock->shouldReceive('getNewOrders')->andReturn($mockdata);
        });

        $class  = new \ReflectionClass(TaskForManagersService::class);
        $method = $class->getMethod('getOrdersAndStatusesAllOrders');
        $method->setAccessible(true);
        $result = $method->invokeArgs(new TaskForManagersService(), ['site']);
        dd($result);

Но dd мне показывает реальный результат клиента, а не ожидаемый mockData...
В случае использования класса без construct, класс с указанным методом мокается без проблем. Прошу подсказать, в чем дело? Либо не так использую Mockery?

Подвал раздела