wake-up-neo.com

PHPUnit - Autoload Klassen innerhalb von Tests

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.

17
Martyn

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();
25
Raaghu

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.

4
ImLeo

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>

1
Amorphous

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. 

1
Alex