PHPUnit und Globals

8

Ich lerne und erkunde Anwendungen von PHPUnit mit PHP 5.2.9 und stoße auf das globale Problem. Ich habe $ backupGlobals auf FALSE gesetzt, das doc '@backupGlobals disabled' eingeschlossen und dies scheint das Verhalten von PHPUnits Backup der Globals nicht zu beeinflussen. Gibt es etwas, das mir fehlt? Muss ich die XML-Datei von PHPUnit ändern? Erstellen Sie einen Bootstrap?

config.php:

%Vor%

basicApp.php:

%Vor%

BasicAppTest.php:

%Vor%

testGlobal () scheitert an $ this- & gt; assertNotEmpty ($ this- & gt; testClass- & gt; test), was darauf hinweist, dass $ this- & gt; backupGlobals auf FALSE gesetzt ist und dass globale Dateien immer noch von PHPUnit gesichert werden.

EDIT: Ich habe das funktioniert, indem ich die folgenden Änderungen vorgenommen habe -

BasicAppTest.php:

%Vor%

config.php:

%Vor%

Ich bin verblüfft, dass das vorher noch nicht irgendwo behandelt wurde!

    
Malovich 12.03.2012, 17:50
quelle

2 Antworten

10

In Ihrem Testfall definieren Sie eine neue $backupGlobals -Eigenschaft, die PHPUnit nicht sehen kann. Da die Eigenschaft geschützt ist, könnten Sie sie im Konstruktor auf false setzen, aber PHPUnit verwendet seine Konstruktoren, um Informationen zur Ausführung der Testmethode zu übergeben. Erstellen Sie statt dessen eine phpunit.xml Konfigurationsdatei , um den backupGlobals Eigenschaft zu false .

%Vor%     
David Harkness 12.03.2012, 20:41
quelle
2

In Ihren Bearbeitungen und Kommentaren haben Sie auf eine Problemumgehung für das Problem hingewiesen (das explizite Deklarieren von Globals in der getesteten Anwendung). In onlab's Kommentar zu einem PHPUnit-Problem erklärt er das Verhalten: wenn man eine Datei in eine Funktion einfügt, PHP stellt Globals aus den enthaltenen Dateien in den Funktionsumfang. PHPUnit lädt Dateien in einer Funktion, und obwohl es versucht, Globals zu extrahieren, schlägt es in den Fällen fehl, die ich ausprobiert habe.

Leider konnte ich die Probleme meines Altsystems in minimalen Testfällen nicht reproduzieren (und ich hatte Schwierigkeiten, deine zu verstehen), und deshalb kann ich die Erklärung nicht wirklich bestätigen. Aber sein vorgeschlagener Workaround hat mir geholfen: eine Bootstrap-Datei mit der Option --bootstrap zu liefern; Deklarieren Sie jedes globale Element, das von den getesteten Teilen Ihrer Anwendung verwendet wird. Dies vermeidet die Notwendigkeit, die Anwendung zu modifizieren, um sie zu testen. Hier ist das Beispiel von onlab von GitHub:

%Vor%

mit bootstrap.php :

%Vor%     
Leif Arne Storset 09.05.2014 22:48
quelle

Tags und Links