Ich habe folgende Struktur in meinem Projekt:
/
/app
/app/models/ --UserTable.php
/lib
/lib/framework
/lib/framework/Models
/lib/framework/Db
/tests -- phpunit.xml, bootstrap.php
/tests/app
/tests/app/models --UserTableTest.php
Mit den App- und Lib-Verzeichnissen habe ich verschiedene Klassen, die zusammenarbeiten, um meine App auszuführen. Zum Einrichten meiner Tests habe ich eine Datei /tests/phpunit.xml und eine /tests/bootstrap.php erstellt
phpunit.xml
<phpunit bootstrap="bootstrap.php">
</phpunit>
bootstrap.php
<?php
function class_auto_loader($className)
{
$parts = explode('\\', $className);
$path = '/var/www/phpdev/' . implode('/', $parts) . '.php';
require_once $path;
}
spl_autoload_register('class_auto_loader');
Also habe ich folgenden Test:
<?php
class UserTableTest extends PHPUnit_Framework_TestCase
{
protected $_userTable;
public function setup()
{
$this->_userTable = new app\models\UserTable;
}
public function testFindRowByPrimaryKey()
{
$user = $this->_userTable->find(1);
$this->assertEquals($user->id, 1);
}
}
Die Klasse kann jedoch nicht gefunden werden, wenn ich den Test ausführe - PHP Fatal error: Class 'app\models\UserTable' not found in /var/www/phpdev/tests/app/models/UserTableTest.php on line 13
Was mache ich falsch? Ich versuche die PHPUnit-Konfiguration besser zu verstehen, also habe ich mich entschieden, die Konfigurations- und Bootstrap-Datei selbst zu schreiben.
Wenn Sie Composer Autoload verwenden
veränderung
<phpunit colors="true" strict="true" bootstrap="vendor/autoload.php">
zu
<phpunit colors="true" strict="true" bootstrap="tests/autoload.php">
und im tests
-Verzeichnis neuen autoload.php
mit folgendem Inhalt erstellen
include_once __DIR__.'/../vendor/autoload.php';
$classLoader = new \Composer\Autoload\ClassLoader();
$classLoader->addPsr4("Your\\Test\\Namespace\\Here\\", __DIR__, true);
$classLoader->register();
Sie sollten wahrscheinlich composer verwenden, um Ihren Code zu organisieren. Die Datei composer.json in Ihrem Projektstammverzeichnis sollte beispielsweise Folgendes enthalten:
...
"autoload": {
"psr-0": {
"PRJ_NAME\\APP\\": "app/",
"PRJ_NAME\\LIB\\": "lib/"
}
},
...
Nach dem Ausführen des Composer-Updates werden die beiden oben definierten Namespaces in die Datei vendor/composer/autoload_namespaces.php gestellt. Als Nächstes ist es einfach, phpunit mit der Autoload-Option wie folgt auszuführen:
phpunit --bootstrap vendor/autoload.php tests/app/models/UserTableTest
Stellen Sie sicher, dass die Verwendung Ihres Namespaces sowohl im Quellcode als auch im Testcode geändert wird.
Wenn Sie Ihre Klasse mit demselben Bootstrap in der App laden, sollten Sie sie in Tests laden können. Wenn Sie test by cd in Ihrem Testverzeichnis ausführen, fügen Sie einfach phpunit.xml hinzu:
<testsuite name="My Application Tests">
<directory>./</directory>
</testsuite>
In <phpunit></phpunit>
In meinem loader (sehr nahe bei dir) überprüfe ich, ob der erste explodierte Teil des Klassennamens mein Anbieter ist , wenn es nicht der loader ist, kehre zurück und mache nichts (sonst hatte Probleme mit phpunit 's loader , da ich ein Neuling von phpunit bin und nicht weiß, ob dies das erwartete Verhalten ist oder ob phpunit vorschlagen oder angeben Lader gebrauchsfertig).
Ich behalte phpunit.xml
im selben Verzeichnis von tests/
(nicht innerhalb) und einmal konfiguriert <directory>tests</directory>
Ich führe phpunit
in der Befehlszeile ohne Konfigurations- oder Verzeichnisoptionen aus.