在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不会做任何事情,但允许调用方法,这样我以后就可以添加我对它的期望。
尽管我已经找到了一个解决方案,但我仍然想知道是否可以默认地模拟所有方法,然后检查是否调用了某些方法。
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([]);
}