2015-12-01 3 views
0

В приложении silex у меня есть класс KafkaAPiClient, который определенно имеет общедоступный метод postMessages.Как исправить издевательства над макетами объекта BadMethodCallException?

<?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 

Я запутался, я ожидал для макет, чтобы не сделать ничего, но позволить методам называть так, чтобы я позже мог добавить к нему свои надежды.

Несмотря на то, что я нашел решение, мне все еще интересно, можно ли издеваться над всеми методами по умолчанию, а затем проверить, были ли определенные вызовы.

+0

он говорит, что не имеет функцию postMessages()? я думаю, вы должны проверить KafkaApiClient –

+0

@MuratCemYALIN Nope, у конкретного класса есть метод. Я абсолютно уверен в этом, это макет, который этого не делает. – k0pernikus

+0

может быть защищено или закрыто? –

ответ

1

Существует shouldIgnoreMissing метод на макет объекта. Calling, что делает exactly what it says on the tin, то есть: игнорирование вызовов на еще не определены методы, в результате чего издеваться, что ничего не делает:

$leMock = \Mockery::mock(KafkaApiClient::class); 
$leMock->shouldIgnoreMissing() 
$leMock->postMessages([]); 

И ничего, это ничего не значит. Я попал в другую ошибку для своей очереди, когда я создавал макет таким образом, поскольку методы возвращают null по умолчанию, и их возвращаемое значение должно быть явно указано.

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

Любой вызов getMessages теперь будет возвращать именно массив [$msg].

В качестве альтернативы, один может быть очень четко о том, какие методы вызываются с издевательством, добавив shouldReceive:

public function testMockMethodIsCallable() 
{ 
    $leMock = \Mockery::mock(KafkaApiClient::class); 
    $leMock->shouldReceive('postMessages'); 
    $leMock->postMessages([]); 
}