Ich habe etwas wie das Folgende in Laravel eingerichtet:
In /app/controllers/MyController.php
:
In /app/tests/MyControllerTest.php
:
Wenn ich jedoch vendor/bin/phpunit
starte, erhalte ich den folgenden Fehler:
Wenn ich den Verweis auf die Klasse MyController
in myDataProvider()
lösche und durch eine Literalkonstante ersetze, wird der Test erfolgreich abgeschlossen.
Außerdem kann ich Referenzen auf MyController::MAX_FILE_SIZE
innerhalb der tatsächlichen Methode testMyController()
platzieren, und der Test wird ebenfalls erfolgreich abgeschlossen.
Es scheint, dass das Autoloading-Setup für Laravel-Framework-Klassen erst eingerichtet wird, wenn nach die Datenprovidermethode aufgerufen wird, aber vor die eigentlichen Testmethoden sind namens. Gibt es eine Möglichkeit, um Laravel-Framework-Klassen innerhalb eines PHPUnit-Datenanbieters aufzurufen?
HINWEIS: Ich rufe PHPUnit direkt über die Befehlszeile und nicht über eine IDE (wie NetBeans) auf. Ich weiß, dass einige Leute Probleme damit hatten, aber ich glaube nicht, dass das auf mein Problem zutrifft.
Wie in dieser Antwort impliziert, scheint dies mit der Reihenfolge zusammenzuhängen, in der PHPUnit die Datenanbieter und die setUp()
Methode in allen Testfällen.
PHPUnit ruft die Datenprovidermethoden auf, bevor Tests ausführt. Vor jedem Test wird im Testfall auch die Methode setUp()
aufgerufen. Laravel hängt sich in die setUp()
-Methode ein, um $this->createApplication()
aufzurufen, was die Controller-Klassen zum 'include path' hinzufügt, damit sie automatisch geladen werden können.
Da die Datenprovidermethoden vor diesem Ereignis ausgeführt werden, schlagen alle Verweise auf Controller-Klassen in einem Datenprovider fehl. Es ist möglich, dies zu umgehen, indem Sie die Testklasse in etwa so ändern:
%Vor% Dies ruft createApplication()
auf, bevor die Datenprovidermethoden ausgeführt werden. Daher gibt es eine gültige Anwendungsinstanz, die es den entsprechenden Klassen ermöglicht, automatisch geladen zu werden.
Dies scheint zu funktionieren, aber ich bin mir nicht sicher, ob es die beste Lösung ist oder ob es wahrscheinlich Probleme verursacht (obwohl ich mir keine Gründe dafür vorstellen kann).
Der Test wird viel schneller initialisiert, wenn Sie das Anwendungsrecht innerhalb der dataProvider-Methode erstellen, insbesondere wenn Sie eine große Menge von zu testenden Elementen haben.
%Vor%Tags und Links php phpunit automated-tests laravel