PHPSpec shouldBeCalled()方法

时间:2013-06-19 19:07:49

标签: php unit-testing testing phpunit phpspec

我不知道这种方法是如何工作的。以下是我尝试使用它的示例:

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文件夹中)。这给了我一个错误没有呼叫匹配,但至少有一个是预期的为什么这不起作用?谢谢。

1 个答案:

答案 0 :(得分:2)

您能提供MyObject的实施吗?如果你想得到正确答案,将会有所帮助。

当您尝试创建对象方法的模拟时->shouldBeCalled()基本上意味着应该在对象onChange()上调用带有参数$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);
        }
    }
}