2016-09-26 6 views
0

私はクラスを作成するためにphpSpecを使用する作業を始めようとしています。私は、イベントハンドラの1つでハンドルメソッドをテストすることに遭遇しました。phpSpecなしbeCalled([配列:0])matcherが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機能で使用されている場合同じ名前とタイプのものがある場合、と同じです)、またはオブジェクトでprophesizeを呼び出して取得できる「明示的な」モックがあります。それらの間の唯一の違いは、 "暗黙の"モックが自動的にチェックされる一方、 "明示的な"モックは手動でチェックされる必要があるということです($prophet->checkPredictions();

+0

これはうまくいきました。 –

+0

@AndresZapataあなたを歓迎します;) – DonCallisto

関連する問題