【发布时间】:2016-03-05 08:04:47
【问题描述】:
在一个 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
我很困惑,我期待模拟不会做任何事情,但允许调用方法,以便我以后可以添加我的期望。
虽然我找到了解决方案,但我仍然想知道是否可以默认模拟所有方法,然后检查是否调用了某些方法。
【问题讨论】:
-
它说它没有 postMessages() 函数?我认为你应该检查 KafkaApiClient
-
@MuratCemYALIN 不,具体的类有方法。我完全确定了这一点,它的模拟没有。
-
可能是受保护的还是私有的?
-
@MuratCemYALIN 这是公开的,这不是问题。具体类不是问题。
标签: php unit-testing phpunit mockery