Das Erstellen einer Basis-Testklasse für PHPUnit und das Erweitern für allgemeine Funktionen führt zu einem Fehler „Klasse nicht gefunden“.

Lesezeit: 3 Minuten

Benutzer-Avatar
r.bilgil

Ich verwende PHPUnit mit einer Bootstrap-Datei zum automatischen Laden von Klassen (generiert von Composer).

Alle meine Tests laden Klassen gut, aber für zwei meiner Tests habe ich eine “Basis” -Testklasse erstellt, die sich erweitert \PHPUnit\Framework\TestCase (ähnlich zu PHPUnit_Framework_TestCase vor PHPUnit7), und dann zwei Testklassen, die die Basisklasse erweitern, ähnlicher Aufbau wie im folgenden Beispielcode:

    abstract class BaseTest extends \PHPUnit\Framework\TestCase
    {
        abstract function setUp();

        protected function getCommonTestVariables()
        {
            // ...
        }

        protected function runCommonTests()
        {
            // ...
        }
    }
    class BlahBlahTest extends BaseTest
    {
        public function setUp()
        {
             $variables=$this->getCommonTestVariables();
             //etc...
        }

        public function testThings()
        {
            $this->runCommonTests();
        }
    }

Immer wenn ich dies ausführe, gibt PHPUnit einen Fehler aus:

Schwerwiegender Fehler: Klasse ‘BaseTest’ nicht gefunden in BlahBlahTest.php in Zeile 13

Ich habe Dateinamen, Speicherorte, Namespaces überprüft und alles scheint in Ordnung zu sein. Um dem auf den Grund zu gehen, wäre jede Hilfe willkommen

  • Sind die Klassen in einer Datei oder in zwei? Wenn letzteres der Fall ist, müssen Sie entweder die Klasse einschließen oder das automatische Laden konfigurieren.

    – Sven

    18. September 2013 um 19:58 Uhr

  • Sie befinden sich in zwei Dateien. Wie ich in meinem Beitrag sagte, habe ich eine Bootstrap-Datei mit einem Composer-Autoloader konfiguriert

    – r.bilgil

    18. September 2013 um 21:47 Uhr

  • Dieser Composer-Autoloader funktioniert nicht wie Zauberei. Ist es so konfiguriert, dass es Ihre BaseTest-Klasse automatisch lädt? Und wenn ja: Wie?

    – Sven

    18. September 2013 um 21:53 Uhr


Benutzer-Avatar
Potherca

Ich bin auf dasselbe Problem gestoßen, und wenn Sie mit dem Innenleben von PHPUnit und Composer nicht allzu vertraut sind, kann dies in der Tat verwirrend erscheinen.

PHPunit verwendet nicht den Composer-Autoloader, um Ihre Testklassen zu finden. Es scannt einfach jedes Verzeichnis, das Sie ihm geben, und bearbeitet jeweils eine Datei.

Daher kennt es keine andere Klasse als die in der Datei, mit der es gerade arbeitet. Hier kommt die Bootstrap-Datei ins Spiel.

Wenn Sie den Composer Autoloader verwenden möchten, um andere Testklassen zu laden, müssen Sie ihm mitteilen, wo er diese Testklassen finden kann (und optional in welchem ​​Namensraum).

Dazu gibt es zwei Möglichkeiten:

  1. Fügen Sie ein hinzu autoload-dev Abschnitt zu Ihnen composer.json oder
  2. Fügen Sie das Testverzeichnis zum Composer Autoloader hinzu

Verwenden autoload-dev

Das autoload-dev Abschnitten können Sie Autoload-Regeln für Entwicklungszwecke definieren.

Zitat direkt von das Handbuch:

Klassen, die zum Ausführen der Testsuite benötigt werden, sollten nicht in den Hauptregeln für das automatische Laden enthalten sein, um zu vermeiden, dass der Autoloader in der Produktion verschmutzt wird und wenn andere Personen Ihr Paket als Abhängigkeit verwenden.

Daher ist es eine gute Idee, sich auf einen dedizierten Pfad für Ihre Komponententests zu verlassen und ihn im Abschnitt autoload-dev hinzuzufügen.

Beispiel:

{
    "autoload": {
        "psr-4": { "MyLibrary\\": "src/" }
    },
    "autoload-dev": {
        "psr-4": { "MyLibrary\\Tests\\": "tests/" }
    }
}

Zum Composer Autoloader hinzufügen

Eine Alternative wäre, sich den Composer Autoloader zu holen und add Ihr Test-Namespace (falls vorhanden) und das Verzeichnis, in dem sich Ihre Tests befinden. Wie macht man das, wie im Handbuch beschrieben (unten im Abschnitt zum automatischen Laden in “Grundlegende Verwendung”) lautet:

$loader = require('/path/to/vendor/autoload.php');
$loader->add('Test\\', __DIR__ . '/Tests');

Wenn Ihre Tests Namespaces verwenden, die das Testverzeichnis spiegeln, und Sie immer noch Probleme haben, können Sie versuchen, das Präfix wegzulassen, indem Sie den ersten Parameter ersetzen ('Test\\') mit ''.


Wenn Sie mehr darüber erfahren möchten, wie das alles funktioniert, sollten Sie sich die ansehen Composer ClassLoader-Klasseinsbesondere das add() und findFile() Methoden.

Für mich war die Lösung viel einfacher.

  1. Ich habe den Großbuchstaben von geändert Test zu test am Ende der Datei und den Klassennamen

BaseSomethingtest.php

<?php

namespace Something\Tests\Sub1\Sub2;

class BaseSomethingtest
{
}
  1. Ich habe nur ein Wort an das Ende meiner Basisklasse gesetzt. Soweit es noch nicht zu Ende war Test, phpunit habe es nicht angerufen

BaseSomethingTestCase.php

<?php

namespace Something\Tests\Sub1\Sub2;

class BaseSomethingTestCase
{
}

Benutzer-Avatar
Barry Norman

Ich bin mir nicht sicher, ob Sie noch eine Lösung brauchen, aber das hat bei mir funktioniert:
Nicht testbare Basisklasse, die PHPUnit_Framework_TestCase erweitert

In PHP 7.0+ extends PHPUnit_Framework_TestCasegewechselt zu extends \PHPUnit\Framework\TestCaseProbier diese.

1227040cookie-checkDas Erstellen einer Basis-Testklasse für PHPUnit und das Erweitern für allgemeine Funktionen führt zu einem Fehler „Klasse nicht gefunden“.

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy