2017-03-02 60 views
0

我想在PHPSpec中創建一個測試函數,該函數使用不同參數調用另一個對象上的函數。到目前爲止,我的嘗試導致了幾個不同的錯誤,所以我會概述我到目前爲止所做的。您如何模擬一個調用多次使用PHPSpec中的參數更改參數的函數調用?

最近發生的錯誤:

- it should find all realm data 
    method call: 
    - fetch(LeagueOfData\Adapters\Request\RealmRequest:000000001212f67d000000001262e5c6 Object (
     'apiDefaults' => Array &0 (
      'region' => 'euw' 
    ) 
     'format' => null 
     'data' => null 
     'query' => null 
     'where' => Array &0 
)) 
    on Double\AdapterInterface\P51 was not expected, expected calls were: 
    fetch(exact(Double\RequestInterface\P50:000000001212f607000000001262e5c6 Object (
     'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*) 

的PHPSpec文件:

class JsonRealmsSpec extends ObjectBehavior 
{ 
    function let(AdapterInterface $adapter, LoggerInterface $logger, RequestInterface $request) 
    { 
     // fetch called with multiple request objects but we're not interested in the exact data it returns yet. 
     $adapter->fetch($request)->willReturn(['test data']); 
     $this->beConstructedWith($adapter, $logger); 
    } 

    function it_should_find_all_realm_data() 
    { 
     $this->findAll()->shouldReturnArrayOfRealms(); 
    } 


    function getMatchers() 
    { 
     return [ 
      'returnArrayOfRealms' => function($realms) { 
       foreach ($realms as $realms) { 
        if (!$realm instanceof Realm) { 
         return false; 
        } 
       } 
       return true; 
      } 
     ]; 
    } 
} 

和實際功能進行測試:

class JsonRealms implements RealmService 
{ 
    const REGIONS = ['euw', 'eune', 'na']; 

    private $source; 
    private $log; 
    private $realms; 

    public function __construct(AdapterInterface $adapter, LoggerInterface $log) 
    { 
     $this->source = $adapter; 
     $this->log = $log; 
    } 

    public function findAll() : array 
    { 
     $this->realms = []; 
     foreach (self::REGIONS as $region) { 
      $request = new RealmRequest(['region' => $region]); 
      $response = $this->source->fetch($request); 
      $this->realms[] = new Realm($realm['cdn'], $realm['v'], $region); 
     } 
     return $this->realms; 
    } 
} 

我敢肯定,我可能丟失一些非常明顯的事情,但對於我的生活,我現在看不到它。

+0

這裏的問題不是你要在SUS中多次調用函數(系統在規範下;你的類)。問題在於你在該類中創建它,而@ spec級別則聲明你期望與協作者進行調用(並且它不是同一個對象(類型)並且具有不同的值)。看看我的[回答](http://stackoverflow.com/questions/42307939/how-to-get-property-from-stub-function-argument)一個類似的問題。 – DonCallisto

+0

嗨,我不確定我完全理解你的答案。我多次調用的函數並不是我正在測試的。我只是在嘲笑它。我測試如果findAll()函數返回一個Realm對象數組。這是從一些重構的地方,我已經改變了從獲取單個領域的功能,並獲取所有的領域。我已經自己解決了這個問題,並會增加答案。 – Acaeris

回答

1

因此,原來我失去了一些東西很明顯,我試圖用一個單一的模擬電話來解決它,而不是爲每個案例:

function let(AdapterInterface $adapter, LoggerInterface $logger) { 
    $request = new RealmRequest(['region' => 'euw']); 
    $adapter->fetch($request)->willReturn([ 
     'cdn' => 'http://test.url/euw', 
     'v' => '7.4.3' 
    ]); 
    $request = new RealmRequest(['region' => 'eune']); 
    $adapter->fetch($request)->willReturn([ 
     'cdn' => 'http://test.url/eune', 
     'v' => '7.4.3' 
    ]); 
    $request = new RealmRequest(['region' => 'na']); 
    $adapter->fetch($request)->willReturn([ 
     'cdn' => 'http://test.url/na', 
     'v' => '7.4.3' 
    ]); 
} 

這相應地設置了模擬適配器,以便我們可以測試服務是否正確創建Realm對象。

相關問題