2016-09-26 5 views
0

Я пытаюсь войти в рабочую среду с помощью phpSpec для создания своих классов. Я наткнулся на тестирование метода дескриптора на одном из моих обработчиков событий.phpSpec no beCalled ([array: 0]) совпадение найдено для null

Моя спецификация:

use App\Order; 
use App\Models\Payments\Payment; 
use App\Services\Payments\PaymentService; 
use App\Events\Payments\AccountPayment; 

class RecordPaymentTransactionSpec extends ObjectBehavior 
{ 
    function let(PaymentService $paymentService) 
    { 
     $this->beConstructedWith($paymentService); 
    } 

    function it_is_initializable() 
    { 
     $this->shouldHaveType('App\Handlers\Events\Payments\RecordPaymentTransaction'); 
    } 

    function it_should_record_payment_transaction(AccountPayment $event) 
    { 
     $this->paymentService->recordPayment($event)->shouldBeCalled(); 
    } 
} 

И это моя реализация:

class RecordPaymentTransaction { 

    public $paymentService; 

    /** 
    * Create the event handler. 
    * 
    * RecordPaymentTransaction constructor. 
    * @param PaymentService $paymentService 
    */ 
    public function __construct(PaymentService $paymentService) 
    { 
     $this->paymentService = $paymentService; 
    } 

    /** 
    * Handle the event. 
    * 
    * @param AccountPayment $event 
    * @return void 
    */ 
    public function handle(AccountPayment $event) 
    { 
     $this->paymentService->recordPayment($event); 
    } 

} 

Однако, я получаю эту ошибку:

- it should record payment transaction 
     no beCalled([array:0]) matcher found for null. 

не может видеть то, что я здесь делаю неправильно , Помоги пожалуйста.

ответ

2
function it_should_record_payment_transaction(AccountPayment $event) 
{ 
    $this->paymentService->recordPayment($event)->shouldBeCalled(); 
} 

должен быть

function it_should_record_payment_transaction(
    PaymentService $paymentService, 
    AccountPayment $event 
) { 
    $paymentService->recordPayment($event)->shouldBeCalled(); 
    $this->handle($event); 
} 

или

function it_should_record_payment_transaction(AccountPayment $event) 
{ 
    $prophet = new Prophet(); 
    $paymentService = $prophet->prophesize(PaymentService::class); 

    $paymentService->recordPayment($event)->shouldBeCalled(); 
    $this->handle($event); 

    $prophet->checkPredictions(); 
} 

Это происходит потому, что, когда вы спекуляция класс, вы должны вызвать только открытый метод его и сделать ожидания на сотрудников.

Вам не нужно (и вы не должны делать) коллаборационистов вызовов с

$this->collaboratorName->method->shouldBeCalled() 

использования «неявных» издевается (путем передачи их в метод спецификации подписи: если они используются в let функции и имеют одно и то же имя и тип, они те же макеты для phpspec) или «явные» макеты, которые вы можете получить, позвонив prophesize по адресу Prophet. Единственное различие между ними заключается в том, что «неявные» mocks проверяются автоматически, тогда как «явные» должны быть проверены вручную ($prophet->checkPredictions();)

+0

Это сработало, спасибо вам большое за разъяснение. –

+0

@AndresZapata, пожалуйста;) – DonCallisto