Как исправить ошибку 'No expectations were specified' при использовании метода factory в библиотеке Mockery?

Какую логику необходимо протестировать в следующем коде: 

```php
public function handle(ConsumerMessage $message): bool
{
    $action = $message->getAction();

    $mpnIdBrandIdSkuMarketplaceIds = $this->converter->convert($message);

    if (empty($mpnIdBrandIdSkuMarketplaceIds) === false) {
        $mpnIds = ArrayHelper::arrayColumnUnique($mpnIdBrandIdSkuMarketplaceIds, self::MPN_ID_FIELD);

        $this->eventManager->triggerEvent(new NewEventSystemMessageEvent($message, $mpnIds));

        $allowedMpnIds                = $this->allowedFcMpnIdsFilter->filter($mpnIds);
        $allowedMpnIdsIndexedByMpnIds = array_combine($allowedMpnIds, $allowedMpnIds);

        foreach ($mpnIdBrandIdSkuMarketplaceIds as $item) {
            $mpnId         = $item[self::MPN_ID_FIELD];
            $marketplaceId = $item[self::MARKETPLACE_PRODUCT_ID_FIELD];

            if (self::DELETE_ACTION === $action) {
                if ($marketplaceId !== null) {
                    $this->identifiersBufferByAction[$action][$marketplaceId] = $marketplaceId;
                    $this->marketplaceProductIdToMpnId[$marketplaceId] = $mpnId;
                }
            } elseif (isset($allowedMpnIdsIndexedByMpnIds[$mpnId])) {
                $this->identifiersBufferByAction[$action][$mpnId] = $mpnId;
            }
        }
    }

    foreach ($this->identifiersBufferByAction as $action => $identifiers) {
        if ($this->maxBufferSize <= count($identifiers)) {
            $this->innerFlush($action, $identifiers);
        }
    }
}
```

Можете ли вы уточнить, какие конкретные аспекты этой логики требуют тестирования?
  • 16 января 2025 г. 17:04
Ответы на вопрос 2
Ошибка `No expectations were specified` при использовании Mockery возникает, когда вы не указали ожидания (expectations) для мока, который вы пытаетесь протестировать. Чтобы исправить эту ошибку, вам нужно определить, какие методы вашего мока должны быть вызваны и с какими аргументами, а затем использовать методы Mockery для указания этих ожиданий.

Пример использования Mockery для исправления ошибки:

```php
public function testHandleMethod() {
    $message = Mockery::mock(ConsumerMessage::class);
    $message->shouldReceive('getAction')->andReturn('some_action'); // Укажите ожидаемое значение
    $message->shouldReceive('...'); // Укажите другие ожидаемые действия

    $converter = Mockery::mock(YourConverterClass::class);
    $converter->shouldReceive('convert')->with($message)->andReturn($expectedResult);

    // Создаем моки для остальных зависимостей и задаем ожидания
    $eventManager = Mockery::mock(YourEventManagerClass::class);
    $allowedFcMpnIdsFilter = Mockery::mock(YourFilterClass::class);
    
    // Здесь вы можете указать ожидания для остальных методов
    // ...

    // Создайте экземпляр тестируемого класса
    $yourClass = new YourClass($converter, $eventManager, $allowedFcMpnIdsFilter);
    
    // Вызов метода и проверка результата
    $result = $yourClass->handle($message);
    $this->assertTrue($result); // Проверьте ожидаемый результат
}
```

### Логика, которую нужно протестировать в представленном методе

1. **Вызов методов на зависимостях**:
   - Убедитесь, что метод `convert` класса `converter` вызывается с правильным сообщением.
   - Проверьте, что `triggerEvent` вызывается с правильным событием и идентификаторами MPN.
   - Убедитесь, что фильтр `allowedFcMpnIdsFilter` корректно применяется к списку идентификаторов.

2. **Логика обработки данных**:
   - Проверьте, вызывается ли `innerFlush` с правильными аргументами при достижении максимального размера буфера.
   - Убедитесь, что данные корректно добавляются в `$this->identifiersBufferByAction` в соответствии с разными действиями (`DELETE_ACTION` или другими).

3. **Проверка различных сценариев**:
   - Тестируйте сценарии, когда `mpnIdBrandIdSkuMarketplaceIds` пуст, и когда он не пуст.
   - Проверьте воздействие при различных значениях `action`, включая случай, когда оно равно `DELETE_ACTION`.

4. **Проверка ошибки**:
   - Убедитесь, что метод корректно обрабатывает случаи, когда данные не соответствуют ожидаемым условиям (например, когда `mpnId` отсутствует или `marketplaceId` равен `null`).

Тесты должны охватывать как положительные, так и отрицательные сценарии, чтобы убедиться, что метод работает правильно в различных условиях.
Моки и их ожидания нужно описывать до вызова кода который от этих моков зависит. 

У вас часть ожиданий описана в самом конце теста, уже после вызова тестируемых методов.
Похожие вопросы