Как можно исправить ошибку «Mockery\Exception\NoMatchingExpectationException»?

Мне необходимо протестировать определённую логику в следующем коде: <br/> <pre><code class="php">public function handle(ConsumerMessage $message): bool
    {
        $action = $message-&gt;getAction();

        $mpnIdBrandIdSkuMarketplaceIds = $this-&gt;converter-&gt;convert($message);

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

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

            $allowedMpnIds                = $this-&gt;allowedFcMpnIdsFilter-&gt;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-&gt;identifiersBufferByAction[$action][$marketplaceId] = $marketplaceId;
                        $this-&gt;marketplaceProductIdToMpnId[$marketplaceId] = $mpnId;
                    }
                } elseif (isset($allowedMpnIdsIndexedByMpnIds[$mpnId])) {
                    $this-&gt;identifiersBufferByAction[$action][$mpnId] = $mpnId;
                }
            }
        }

        foreach ($this-&gt;identifiersBufferByAction as $action =&gt; $identifiers) {
            if ($this-&gt;maxBufferSize &lt;= count($identifiers)) {
                $this-&gt;innerFlush($action, $identifiers);
 
  • 21 января 2025 г. 9:04
Ответы на вопрос 1
Ошибка `Mockery\Exception\NoMatchingExpectationException` обычно возникает при использовании библиотеки Mockery в тестах, когда вы ожидаете некоторый вызов метода на мок-объекте, но этот вызов не был выполнен. В вашем случае, это может быть связано с тем, что некоторые методы или зависимости в вашем коде не были правильно настроены или вызваны. 

Вот несколько шагов, которые могут помочь вам понять и исправить эту ошибку:

1. **Проверьте, что все ожидаемые вызовы настроены правильно.** Если вы ожидаете, что метод будет вызван на мок-объекте, убедитесь, что он действительно вызывается в вашем коде. Например:

   ```php
   $mock = Mockery::mock(SomeClass::class);
   $mock->expects()->someMethod(); // Убедитесь, что этот метод будет вызван
   ```

2. **Проверьте, правильно ли настроены мок-объекты.** Если вы мокаите зависимости в классе, например, `$this->converter`, `$this->eventManager`, убедитесь, что они настроены на ожидаемые вызовы:

   ```php
   $this->converter = Mockery::mock(Converter::class);
   $this->eventManager = Mockery::mock(EventManager::class);
   ```

3. **Используйте метод `shouldReceive`.** Убедитесь, что используете метод `shouldReceive` для настройки ожидаемого поведения:

   ```php
   $this->converter->shouldReceive('convert')
       ->once() // или нужное количество раз
       ->andReturn($expectedValue);
   ```

4. **Проверьте, что все методы, которые должны вызываться, действительно вызываются.** Если вы ожидаете, что метод вызовется, но код не доходит до этой точки, это также может быть причиной вашей ошибки.

5. **Посмотрите на структуру ваших тестов.** Убедитесь, что ваши тесты настроены правильно, и вызывается именно тот код, который вы хотите протестировать.

6. **Отладка.** Добавьте отладочные сообщения или используйте отладчик, чтобы понять, что происходит в вашей функции. Убедитесь, что методы действительно вызываются и выполняются как ожидалось.

7. **Сброс мока.** Если вы повторно используете моки в разных тестах, убедитесь, что вы сбрасываете их состояние перед запуском каждого теста.

8. **Проверьте порядок вызовов.** Если у вас есть последовательные вызовы методов, проверьте, что порядок вызовов соответствует ожидаемым.

Вот пример настройки моков, чтобы это работало:

```php
public function testHandle()
{
    // Подготовка
    $message = Mockery::mock(ConsumerMessage::class);
    $message->shouldReceive('getAction')->andReturn('delete'); // Укажите действие
    $this->converter = Mockery::mock(Converter::class);
    $this->eventManager = Mockery::mock(EventManager::class);
    
    // Предполагаемое поведение
    $this->converter->shouldReceive('convert')->andReturn([
        ['mpn_id' => 'some_mpn', 'marketplace_product_id' => 'some_id']
    ]);
    $this->eventManager->shouldReceive('triggerEvent')->once();

    // Действие
    $result = $this->yourClass->handle($message);

    // Проверка результата
    $this->assertTrue($result);
}
```

Попробуйте внести эти изменения и посмотрите, решит ли это вашу проблему.
Похожие вопросы