如何修复嘲笑模拟对象抛出BadMethodCallException


How to fix mockery mock object throwing BadMethodCallException?

在silex应用程序中,我有一个KafkaAPiClient类,它肯定具有公共方法postMessages

<?php
namespace Kopernikus'KafkaWriter;
use Kopernikus'KafkaWriter'Model'AbstractMessage;
/**
 * KafkaApiClient.
 **/
class KafkaApiClient
{
    /**
     * @param AbstractMessage[] $msg
     */
    public function postMessages(array $messages)
    {
        foreach ($messages as $message) {
            $this->postMessage($message);
        }
    }
    public function postMessage(AbstractMessage $msg)
    {
         ...
    }
}

我可以很好地调用KafkaAPiClient::postMessages,但在测试中嘲笑类时:

<?php
namespace unit'Request;
use Kopernikus'KafkaWriter'KafkaApiClient;
/**
 * MockeryMethodsNotBeingCallableTest
 **/
class MockeryMethodsNotBeingCallableTest extends 'PHPUnit_Framework_TestCase
{
    public function testMockMethodIsCallable()
    {
        $leMock = 'Mockery::mock(KafkaApiClient::class);
        $leMock->postMessages([]);
    }
}

我得到:

1) unit'Request'MockeryMethodsNotBeingCallableTest::testMockMethodIsCallable
BadMethodCallException: Method Mockery_11_Kopernikus_KafkaWriter_KafkaApiClient::postMessages() does not exist on this mock object
~/le-project/tests/unit/Request/MockeryMethodsNotBeingCallableTest.php:14

我很困惑,我希望mock不会做任何事情,但允许调用方法,这样我以后就可以添加我对它的期望。

尽管我已经找到了一个解决方案,但我仍然想知道是否可以默认地模拟所有方法,然后检查是否调用了某些方法。

mock对象上存在shouldIgnoreMissing方法。调用它完全符合它在锡上所说的:忽略对尚未定义的方法的调用,导致一个什么都不做的mock:
$leMock = 'Mockery::mock(KafkaApiClient::class);
$leMock->shouldIgnoreMissing()
$leMock->postMessages([]);

毫无意义。当我以这种方式实例化mock时,我的队列遇到了另一个错误,因为方法默认情况下会返回null,并且必须显式声明它们的返回值。

$msg = new Message('dummy-message');
$this->kafkaQueue
     ->shouldIgnoreMissing()
     ->shouldReceive('getMessages')->andReturn([$msg]);

现在,对getMessages的任何调用都将准确地返回数组[$msg]

或者,通过添加shouldReceive:,可以非常明确地使用Mockery调用什么方法

public function testMockMethodIsCallable()
{
    $leMock = 'Mockery::mock(KafkaApiClient::class);
    $leMock->shouldReceive('postMessages');
    $leMock->postMessages([]);
}
相关文章:
  • 没有找到相关文章