1

この方法がどのように機能するかわかりません。これが私がそれを使用しようとしている例です:

namespace spec;

use PhpSpec\ObjectBehavior;

class MyObjectSpec extends ObjectBehavior
{
    /**
     * @param SomeEvent $event
     * @param SomeSubscriber $subscriber
     */
    function it_formats_the_string_as_a_header_if_underline_with_single_dashes(
        $event,   
        $subscriber
    )
    {
        $subscriber->onChange($event)->shouldBeCalled(); //RIGHT HERE

        // when
        $this->addSubscriber($subscriber);
        $this->doWhatever($event);
    }
}

class SomeEvent {}

class SomeSubscriber
{
    function onChange($event){}

    function usesOnChange(){
        $someEvent = new SomeEvent();
        $this->onChange($someEvent);
    }

}

名前空間は正しく、ファイルはそれぞれ ObjectSpec.php 、 SomeEvent.php (src フォルダー内) 、 SomeSubscriber.php (src フォルダー内) にあります。これにより、 No Call has been matching but a least one was expectedというエラーが発生しますなぜこれが機能しないのですか? ありがとうございました。

4

1 に答える 1

2

の実装を提供していただけますMyObjectか? 適切な回答を得たい場合に役立ちます。

object メソッドのモックを作成しようとしている場合、->shouldBeCalled()基本的には、 objectonChange()でパラメーターを持つメソッドを$event呼び出す必要があることを意味します$subscriber

あなたが得ているメッセージは、基本的にメソッドが呼び出されなかったことを意味し、今それを実装する必要があるステップです。

PHPSpec の実行で成功するクラスの基本的な実装を提供しました。

<?php

class MyObject
{
    private $subscribers = array();

    public function addSubscriber($subscriber)
    {
        $this->subscribers[] = $subscriber;
    }

    public function doWhatever($event)
    {
        foreach($this->subscribers as $subscriber) {
            $subscriber->onChange($event);
        }
    }
}
于 2013-06-20T15:59:26.657 に答える