2017-10-19 2 views
0

Im Folgenden ist der phpspec Code Ich habePHPSpec stellt nicht die Methode des Subjekts

function it_throws_if_raw_data_xml_is_invalid() 
{ 
    $website = $this->buildWebsite("some-deterministic-id", "some-deterministic-name"); 

    $this->convertAdwordsRawData($website, "yesterday", "invalidXML"); 

    $this->shouldThrow(AdwordsResponseNotParseable::class) 
     ->during("convertAdwordsRawData", [$website, "yesterday", "invalid-xml"]); 
} 

Der Test schlägt fehl, aber nicht, weil die Logik ist falsch, aber weil convertAdwordsRawData wird nie aufgerufen. Ich habe var_dump hinzugefügt und es wird nicht angezeigt, während die Ausgabe des Konstruktors durchläuft. Ich habe versucht, statt einer $ -Website eine Zeichenfolge zu übergeben, und habe ein typhint-Problem. Wenn ich die Methode nur innerhalb des Tests ohne Assertion aufruft, ruft sie die Methode nie auf und übergibt den Test, ohne etwas aus var_dump auszugeben. Zusammenfassend, phpspec führt die Methode einfach nicht für mich aus. Ein Test darüber, der die gleiche öffentliche Methode testet, funktioniert gut.

Was könnte hier falsch sein?

Für das Argument willen, die Methode berücksichtigen macht folgende

public function convertAdwordsRawData(Websites $website, string $time, string $rawData): \Generator 
    { 
     var_dump("Here I am"); 
     throw new AdwordsResponseNotParseable($rawData); 
     yield from [1,2,3,4,5]; 
    } 

aktualisieren Okay, es läuft alles auf kommt, wie PHP-Generatoren behandelt. Der Methodenaufruf gibt mir einen Iterator zurück, der noch nicht initialisiert wurde. Wenn ich die Methode für den tatsächlich zurückgegebenen Generator aufruft, wird PHP alles bis zur ersten Ausbeute bei der ersten Iteration ausführen und die Ausbeute bei jeder nachfolgenden Iteration zurückgeben.

Von php.net Website

Wenn eine Generatorfunktion zum ersten Mal aufgerufen wird, ein Objekt von die internen Generator Klasse zurückgegeben wird. Dieses Objekt implementiert die Iterator-Schnittstelle

$this->convertAdwordsRawData(...)->shouldThrow(...)->duringCurrent();

die Lösung. Strom (Call) kommt aus der Umsetzung der Iterator in PHP - diese Methode bei jeder Iteration

+0

Es ist schwer zu erkennen, was falsch läuft im Inneren deine Funktion, ohne sie anzusehen. Versuchen Sie jedoch, einen Haltepunkt in xdebug festzulegen, und führen Sie dann die Ausführung aus, um herauszufinden, was falsch gelaufen ist. XDebug ist ein sehr schnelles, leistungsstarkes und hilfreiches Tool, um diese Art von Fehlern zu beheben. –

+0

Danke für die Antwort. Das Problem liegt nicht in der Funktion, das Problem liegt in der phpspec selbst. Die Methode wird überhaupt nicht aufgerufen. Ich könnte xDebug verwenden, um durch Interna von phpspec zu gehen, aber um ehrlich zu sein, ich habe gehofft, dass es zu diesem –

Antwort

0

Versuchen Sie das mal nennen würde:

function it_throws_if_raw_data_xml_is_invalid(Websites $website) 
{ 
    $this->shouldThrow(AdwordsResponseNotParseable::class) 
    ->during("convertAdwordsRawData", [$website, "yesterday", "invalid-xml"]);  

} 

Weitere Informationen: http://www.phpspec.net/en/stable/cookbook/matchers.html#throw-matcher

+0

nicht kommen wird Genau das hatte ich. Offensichtlich war das Problem meine Unterstellung, wie PHP Iterationen handhabt, obwohl ich den Initialisierungscode (bis zur ersten Ausbeute) ausführen werde. Aber PHP tut es nur bei der ersten Iteration –

Verwandte Themen