2017-03-02 2 views
0

Ich versuche, in PHPSpec einen Test für eine Funktion zu erstellen, die eine Funktion für ein anderes Objekt mit anderen Parametern aufruft. Bis jetzt haben meine Versuche mehrere verschiedene Fehler verursacht, daher werde ich beschreiben, was ich bisher gemacht habe.Wie spottet man einen Funktionsaufruf, der mehrere Male aufgerufen hat, mit sich ändernden Parametern in PHPSpec?

Der letzte Fehler:

- 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*) 

Die PHPSpec Datei:

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; 
      } 
     ]; 
    } 
} 

Und die eigentliche Funktion getestet werden:

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; 
    } 
} 

Ich bin sicher, dass ich wahrscheinlich bin fehlt etwas wirklich Offensichtliches, aber für das Leben von mir kann ich es jetzt nicht sehen.

+0

Problem hier ist nicht, dass Sie die Funktion mehrmals in SUS aufrufen (System unter Spezifikation; Ihre Klasse). Das Problem ist, dass Sie es innerhalb dieser Klasse erstellen, während Sie auf der @ spec-Ebene behaupten, dass Sie einen Aufruf mit dem Collaborator erwarten (und es ist nicht dasselbe Objekt (Typ) und hat nicht die gleichen Werte). Schauen Sie sich meine [Antwort] (http://stackoverflow.com/questions/42307939/how-to-get-property-from-stub-function-argument) für eine ähnliche Frage an. – DonCallisto

+0

Hallo, ich bin mir nicht sicher, ob ich deine Antwort verstehe. Die Funktion, die ich mehrmals anrufe, teste ich nicht. Ich verspotte es nur. Ich teste, ob die Funktion findAll() ein Array von Realm-Objekten zurückgibt. Dies ist von einem Refactoring, bei dem ich die Funktion vom Holen eines einzelnen Realms geändert habe, bis zum Abrufen aller von ihnen. Ich habe das Problem jedoch selbst gelöst und werde die Antwort hinzufügen. – Acaeris

Antwort

1

So stellt sich heraus, dass ich fehlte etwas offensichtlich, ich habe es mit einem einzigen Schein-Anruf zu lösen versuchte, wie für jeden Fall im Gegensatz zu einem:

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' 
    ]); 
} 

Diese entsprechend den mock-Adapter einrichtet, so dass Wir können testen, ob der Dienst die Realm-Objekte korrekt erstellt.

Verwandte Themen