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

    kirillprof
    @kirillprof
    Ошибка `No expectations were specified` возникает, когда Mockery вызывает метод на моке, но для этого вызова не настроено ожидание. Это происходит, потому что вы не указали, что именно должен возвращать метод `factory`.

    Метод `factory` должен возвращать объект транзакции, который передаётся в `doTransaction`. Из кода видно, что вы используете `$this->tm->doTransaction($transaction)`, где `$transaction` — результат вызова `factory`. Значит, вам нужно создать мок для транзакции и вернуть его.

    Пример исправления:
    // Создаём мок объекта транзакции
    $transaction = Mockery::mock(TransactionInterface::class); // Или конкретный класс транзакции, если он известен
    
    // Настраиваем ожидания для factory
    $this->insertOnDuplicateKeyUpdateTransactionFactory->shouldReceive('factory')
        ->once()
        ->with(
            ProductQueue::class,
            $trData,
            [ProductQueue::TABLE_COLUMN_MPN_PRODUCT_ID]
        )
        ->andReturn($transaction); // Возвращаем мок транзакции
    
    // Настраиваем вызов метода doTransaction с этим объектом
    $this->tm->shouldReceive('doTransaction')
        ->once()
        ->with($transaction)
        ->andReturnNull(); // Или результат метода doTransaction, если он возвращает что-то

    Теперь тест корректно проверяет вызовы `factory` и `doTransaction`.
    Ответ написан
    2 комментария