Frage

Ich versuche, einige Unit-Tests mit einer setcookie()-Funktion in einer ziemlich guten IDE PhpStorm durchzuführen.Aber ich bekomme jedes Mal die folgende Fehlermeldung:

Cannot modify header information - headers already sent by (output started at /tmp/phpunit.php:418)

Der Grund für diesen Fehler ist wahrscheinlich print('some text') mit Flush() vor dem Aufruf von setcookie().Das Leeren erfolgt jedoch in einer von PHPStorm generierten Datei /tmp/phpunit.php.Während setcookie() aus meinen Quellen aufgerufen wird.Daher kann ich die generierte Datei nicht bearbeiten, um eine Art Ausgabepufferung durchzuführen.Außerdem gibt es noch einen anderen Moment:PHPStorm führt das Skript /tmp/phpunit.php wie folgt aus:

/usr/bin/php /tmp/phpunit.php -config /var/www/.../protected/tests/phpunit.xml d /var/www/.../protected/tests/unit/user

Bitte helfen Sie mir, dieses Problem zu umgehen.Wie kann ich Unit-Tests direkt von PhpStorm aus ausführen?

War es hilfreich?

Lösung

Eine Möglichkeit, dies zu umgehen, besteht darin, einen Scheinersatz für zu verwenden setcookie() Funktion.

Dies ist eine gängige Technik bei Unit-Tests, bei denen Sie etwas testen möchten, das auf einer externen Klasse oder Funktion basiert und den aktuellen Test nicht beeinflussen soll.

Der Weg, dies zu tun, wäre, eine Stub-Funktionsdefinition für zu erstellen setcookie() in Ihrem Unit-Test-Code.Dieser würde dann während des Tests anstelle des echten aufgerufen werden setcookie() Funktion.Wie Sie diese Stub-Funktion genau implementieren, liegt bei Ihnen und hängt davon ab, wofür Ihr Code sie verwendet.

Das Hauptproblem bei diesem Ansatz besteht darin, dass PHP standardmäßig nicht zulässt, dass vorhandene Funktionen überschrieben werden. Wenn Sie dies mit einer Standard-PHP-Installation versuchen, erhalten Sie die Fehlermeldung „Fehler:Funktion kann nicht erneut deklariert werden.

Die Lösung für dieses Problem sind PHPs Runkit-Erweiterung, das explizit für diese Art von Tests entwickelt wurde und Ihnen dies ermöglicht eine bestehende Funktion umbenennen, auch eingebaute.

Wenn Sie die PHP-Installation in Ihrer Testumgebung so konfigurieren, dass sie die Runkit-Erweiterung enthält, können Sie diese Art von Test durchführen.

Hoffentlich hilft das.

Andere Tipps

Ich habe eine einfachere Lösung gefunden.Betrachten Sie diese Klasse: generasacodicetagpre.

Der Test wirft den in der Frage beschriebenen Fehler aus, es sei denn, Sie setzen die Anmerkung @ runinseparateProcess generasacodicetagpre.

Anstatt versuchen, tatsächliche Cookie-Header einzustellen (was fehlschlägt, weil der Inhalt bereits gesendet wurde);Für Testzwecke können Sie den Cookie Superglobal einfach explizit einstellen: generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top