Arhn - архитектура программирования

Слежка за классом, который находится в конструкторе, не может записать полученный вызов метода

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

Тест:

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 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(), но тест все равно не проходит.

26.05.2020

Ответы:


1

Вам нужно использовать внедрение зависимостей и позволить контейнеру службы разрешить зависимость от контейнера, поэтому класс 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);
    }

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

26.05.2020
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..