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
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. –
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 –