2009-05-17 5 views
0

Ich habe die folgende Ordnerstruktur:PHP: Nur Dateien beim Ausführen von Phing einschließen?

/main 
    /loader.php 
    /build.xml 
    /components 
     /package1 
      /class1.php 
     /package2 
      /class2.php 
    /tests 
     /package1 
      /class1.test.php 
     /package2 
      /class2.test.php 

Wenn ich die Web-Anwendung ausführen ich loader.php zuerst laden und andere Komponenten von Loader::load('package_name') aufrufen. Dann sind alle notwendigen Dateien enthalten. Die gute Sache hier ist, dass ich loader.php innerhalb der Klassendateien nicht einschließen muss, weil ich mich darauf verlassen kann, eine funktionierende Instanz von Loader zu haben.

Die Unit-Test-Klassen simulieren dieses Verhalten, indem sie alle erforderlichen Klassen explizit einbeziehen. Es gibt also auch kein Problem mit PHP und PHPUnit.

Aber jetzt möchte ich einen Abdeckungsbericht mit Phing und Xdebug generieren. Das Problem hier ist, dass phing anscheinend jede einzelne PHP-Datei lädt, um die Coverage-Datenbank zu erstellen. Leider stoppt es, weil es die Klasse Loader, die in den PHP-Dateien verwendet wird, nicht finden kann.

Ich könnte leicht eine include-Anweisung zu jeder Klassendatei hinzufügen, aber ich frage mich, ob es eine Möglichkeit gibt, Dateien nur einzubinden, wenn die Code Coverage-Analyse die Datei prüft?

Andere Idee: Ich könnte auch die Coverage-Analyse so konfigurieren, dass sie das Einheitentestverzeichnis durchsucht und alle notwendigen Includes findet. Dann müsste ich Klassen filtern, die mit einem Muster wie /Test$/i oder so übereinstimmen. Möglich?

Antwort

1

Ich suchte nach Alter für etwas Ähnliches.

Am Ende endete ich mit den Änderungen unten. Im Grunde sagen Sie php cli, dass es eine php-Datei vorlegt, die Ihre Ladelogik enthält.

In php.ini meiner cli habe ich folgende Einstellungen vor:

auto_prepend_file = autoload.php

Ich stellte sicher, dass die Datei auf war meine Include-Pfad (/ usr/share/php in mein Fall) und folgende Zeilen einfügen (ich benutze das Zend Framework welches auch auf meinem Include Pfad ist):

require_once "Zend/Loader/Autoloader.php"; $ autoloader = Zend_Loader_Autoloader :: getInstance(); $ autoloader-> registerNamespace ('Model_');

Nun, was Sie tun könnten, ist Ihre __autoload-Funktion definieren und definieren, was automatisch geladen werden muss, aber Sie bekommen die Idee.

Es ist ein hässlicher Hack, aber es hat Dinge für mich erledigt.

Wkr Jeroen

Verwandte Themen