Слежка за классом, который находится в конструкторе, не может записать полученный вызов метода - PullRequest
0 голосов
/ 26 мая 2020

Что я хочу сделать, так это подтвердить, что метод класса был вызван во время запроса. Код, вероятно, лучше объяснит, что я пытаюсь сделать:

Тест:

public function use_default_provider_when_getting_addresses()
{
    $spy = $this->spy(CraftyClicksService::class);
    $this->app->bind(CraftyClicksService::class, function () use ($spy) {
        return $spy;
    });

    $addresses = $this->get('/api/v1/address?postcode=POSTCODE')->decodeResponseJson();

    $this->assertTrue(in_array([
        'line_1' => 'Line 1',
        'line_2' => 'Line 2',
        'postcode' => 'POSTCODE',
    ], $addresses));

    $spy->shouldHaveReceived('getAddresses')->once();
}

Запрос попадает в простой контроллер:

    public function show(Request $request, AddressService $addressService)
    {
        return $addressService->findAddress($request->input('postcode'));
    }

Адресная служба class (пока) затем вызывает функцию другого класса для получения адресов.

class AddressService
{
    protected CraftyClicksService $craftyClicksService;

    /**
     * AddressService constructor.
     */
    public function __construct()
    {
        $this->craftyClicksService = new CraftyClicksService();
    }

    /**
     * @param string $postcode
     * @return array
     */
    public function findAddress(string $postcode)
    {
        return $this->craftyClicksService->getAddresses($postcode);
    }

Я могу «шпионить» за классом AddressService и утверждать, что он получил метод findAddress, однако, похоже, я не могу утверждать getAddresses функция для класса CraftyClicksService.

Я всегда получаю ошибку Method getAddresses(<Any Arguments>) from Mockery_3_App_Services_CraftyClicksService should be called at least 1 times but called 0 times., даже если тест ответа проходит, и я могу подтвердить, что метод действительно вызван.

Пытался использовать $this->app->bind, а также $this->spy(), но тест по-прежнему не проходит.

1 Ответ

0 голосов
/ 26 мая 2020

Вам необходимо использовать внедрение зависимостей и позволить контейнеру службы разрешить зависимость от контейнера, поэтому класс AddressService должен измениться на

class AddressService
{
    protected CraftyClicksService $craftyClicksService;

    /**
     * AddressService constructor.
     */
    public function __construct(CraftyClicksService $CraftyClicksService)
    {
        $this->craftyClicksService = $CraftyClicksService;
    }

    /**
     * @param string $postcode
     * @return array
     */
    public function findAddress(string $postcode)
    {
        return $this->craftyClicksService->getAddresses($postcode);
    }

Таким образом, объект-шпион, который вы привязали к контейнеру будет использоваться.

...