2013-06-19 64 views
1

我不知道這種方法如何工作。這裏是我嘗試使用它的例子:分別PHPSpec shouldBeCalled()方法

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文件夾中) 。這給了我一個錯誤沒有呼叫已匹配,但至少有一個是預期的爲什麼這不工作?謝謝。

回答

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); 
     } 
    } 
} 
+0

謝謝。我是新來的測試框架,我必須爲我的團隊決定PHPUnit和PHPSpec。我們決定從PHPUnit開始,然後在開發過程中轉向PHPSpec,因爲看起來PHPSpec假定您已經瞭解PHPUnit,而且PHPSpec的文檔是有限的。 – applecrusher