Prophecy für PHP: Komplette Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Prophecy für PHP: Komplette Anleitung mit Beispielen

1. Was ist Prophecy und wozu braucht man es?

Prophecy ist eine leistungsstarke objektorientierte Bibliothek zum Erstellen von Mock-Objekten in PHP. Sie bietet eine elegante, ausdrucksstarke und flexible API für Test-Stubs, Spione und gefälschte Objekte, die das Verhalten echter Abhängigkeiten in Unit-Tests simulieren. Im Gegensatz zu vielen anderen Bibliotheken konzentriert sich Prophecy auf die "Prophezeiung" (prophecy) – Sie beschreiben, wie sich ein Objekt verhalten soll, und die Bibliothek generiert automatisch die Implementierung.

Das Hauptziel von Prophecy ist es, das Schreiben von Unit-Tests so einfach und lesbar wie möglich zu machen. Anstatt manuell komplexe Mock-Objekte mit vielen Konfigurationen zu erstellen, "verkünden Sie einfach eine Prophezeiung" für die gewünschte Klasse oder Schnittstelle und rufen dann die Methoden auf, die im getesteten Code aufgerufen werden sollen. Prophecy prüft automatisch, ob die tatsächlichen Aufrufe Ihren Erwartungen entsprechen.

Die Bibliothek ist besonders nützlich beim Testen von Code, der von externen Diensten (Datenbanken, APIs, Dateisystemen), komplexen Objekten oder Objekten mit Nebeneffekten abhängt. Prophecy isoliert den zu testenden Code, indem echte Abhängigkeiten durch vorhersagbare Stubs ersetzt werden. Sie ist der De-facto-Standard für viele PHP-Frameworks, darunter Symfony und Laravel, und wird in beliebten Projekten wie Doctrine und PHPUnit (über Integration) verwendet.

2. Installation

Prophecy wird über Composer installiert, den Standard-Paketmanager für PHP. Führen Sie folgenden Befehl im Stammverzeichnis Ihres Projekts aus:

composer require --dev phpspec/prophecy

Das Flag --dev bedeutet, dass die Bibliothek nur im Abschnitt require-dev Ihrer composer.json hinzugefügt wird, da Prophecy ausschließlich für Tests benötigt wird und nicht in der Produktion verwendet werden sollte.

Wenn Sie PHPUnit verwenden, empfiehlt es sich, auch das Integrationspaket für die automatische Arbeit mit Prophecy zu installieren:

composer require --dev phpspec/prophecy-phpunit

Stellen Sie nach der Installation sicher, dass die Datei vendor/autoload.php in Ihrer Testdatei eingebunden ist (normalerweise geschieht dies automatisch in PHPUnit).

3. Schnellstart – Minimales funktionierendes Beispiel

Schreiben wir einen einfachen Test mit Prophecy. Angenommen, wir haben eine Klasse UserMailer, die einem neuen Benutzer eine Willkommens-E-Mail sendet. Sie ist abhängig vom Interface MailerInterface.

<?php
// Zu testende Klassen
interface MailerInterface {
    public function send(string $to, string $subject, string $body): bool;
}

class UserMailer {
    private $mailer;
    
    public function __construct(MailerInterface $mailer) {
        $this->mailer = $mailer;
    }
    
    public function sendWelcomeEmail(string $email): bool {
        return $this->mailer->send(
            $email,
            'Willkommen!',
            'Vielen Dank für Ihre Anmeldung!'
        );
    }
}

// Test mit Prophecy
use Prophecy\PhpUnit\ProphecyTrait;
use PHPUnit\Framework\TestCase;

class UserMailerTest extends TestCase {
    use ProphecyTrait;
    
    public function testSendWelcomeEmail() {
        // 1. Prophezeiung für MailerInterface erstellen
        $mailerProphecy = $this->prophesize(MailerInterface::class);
        
        // 2. Erwartung deklarieren: Die Methode send wird einmal mit bestimmten Argumenten aufgerufen
        $mailerProphecy->send('user@example.com', 'Willkommen!', 'Vielen Dank für Ihre Anmeldung!')
            ->willReturn(true);
        
        // 3. Mock-Objekt aus der Prophezeiung holen
        $mailerMock = $mailerProphecy->reveal();
        
        // 4. Das zu testende Objekt mit dem Mock erstellen
        $userMailer = new UserMailer($mailerMock);
        
        // 5. Aktion ausführen
        $result = $userMailer->sendWelcomeEmail('user@example.com');
        
        // 6. Behauptung: Die Methode muss true zurückgeben
        $this->assertTrue($result);
        
        // 7. Prophecy prüft automatisch, ob alle Prophezeiungen erfüllt wurden
        // (Dies geschieht normalerweise im tearDown der ProphecyTrait)
    }
}
?>

Dieses Beispiel zeigt den grundlegenden Arbeitsablauf: Prophezeiung erstellen, Erwartungen definieren, Mock-Objekt extrahieren und in den zu testenden Code einfügen. Prophecy überprüft dann automatisch, ob alle Erwartungen erfüllt wurden.

Empfehlungen