Heim > Backend-Entwicklung > PHP-Tutorial > Verspottete Ihre Testabhängigkeiten mit Spott

Verspottete Ihre Testabhängigkeiten mit Spott

William Shakespeare
Freigeben: 2025-02-20 09:07:09
Original
150 Leute haben es durchsucht

Mock your Test Dependencies with Mockery

Während nicht jeder dies tut, ist das Testen Ihrer Bewerbung einer der grundlegendsten Teile eines Entwicklers. Unit -Tests sind der häufigste Test. Bei Unit -Tests können Sie überprüfen, ob eine Klasse genau so ausgeführt wird, wie Sie es erwartet haben. Manchmal verwenden Sie Dienste von Drittanbietern in Ihrer Anwendung, und es ist schwierig, alles für Unit-Tests einzurichten. Dies ist der Zeitpunkt, an dem die Simulation ins Spiel kommt.

Schlüsselpunkte

  • Verspottung ist der Prozess, einen Ersatz für reale Objekte in einem Unit -Test zu erstellen, was besonders nützlich ist, wenn Anwendungen getestet werden, die stark auf die Abhängigkeitsinjektion beruhen.
  • Spott ist eine Bibliothek, die von Pádraic Brady erstellt wurde, mit der Objekte in Unit -Tests verspottet werden können.
  • Mit
  • Spott ermöglicht es Entwicklern, die Erwartungen für die Anzahl der Methodenaufrufe, Parameter und die zurückgegebenen Werte zu definieren, was es zu einem leistungsstarken Tool zum Isolieren von Abhängigkeiten in Unit -Tests macht.
  • Während Phpunit bereits Objekte verspotteten, bietet Spott für Entwickler, die sicherstellen möchten, dass ihre Unit -Tests nicht von anderen Klassen beeinflusst werden.

Was ist Simulation?

Verspottung eines Objekts ist nichts anderes, als ein Ersatzobjekt zu erstellen, das das reale Objekt in Unit -Tests ersetzt. Wenn Ihre Anwendung stark von der Abhängigkeitsinjektion abhängt, ist das Verspotten eine praktikable Art und Weise.

Es kann mehrere Gründe für die Verspottung von Objekten geben:

  1. Es ist am besten, die Klasse bei der Durchführung von Unit -Tests zu isolieren. Sie möchten nicht, dass eine andere Klasse oder ein anderer Dienst Ihre Einheitstests beeinträchtigen.
  2. Das Objekt existiert noch nicht. Sie können zuerst den Test erstellen und dann das endgültige Objekt erstellen.
  3. Mock -Objekte sind normalerweise schneller als die Vorbereitung der gesamten Datenbank zum Testen.

Sie verwenden möglicherweise Phpunit, wenn Sie Unit -Tests ausführen. Phpunit wird mit einigen Standard -Simulationsfunktionen geliefert, wie in der Dokumentation gezeigt. In diesem Artikel von Jeune Asuncion können Sie mehr über Simulationen und die Simulationsfunktionen von Phpunit lesen.

In diesem Artikel werden wir in die von Pádraic Brady erstellte Bibliothekspott eintauchen. Wir werden eine Temperaturklasse erstellen, die Wetterdienste injiziert, die derzeit nicht vorhanden sind.

Einstellungen

Beginnen wir mit der Einrichtung des Projekts. Wir beginnen mit der Datei composer.json, die den folgenden Inhalt enthält. Dies wird sicherstellen, dass wir Spott und Phpunit haben.

<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wir erstellen auch eine Phpunit -Konfigurationsdatei namens Phpunit.xml

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Es ist wichtig, diesen Hörer zu definieren. Wenn es keinen Zuhörer gibt, wenn die Methoden once(), twice() und times() falsch verwendet werden, wird kein Fehler erhöht. Dies wird später ausführlich beschrieben.

Ich habe auch 2 Verzeichnisse erstellt. Das SRC -Verzeichnis wird verwendet, um meine Klassen abzuhalten, und das Testverzeichnis wird verwendet, um unsere Tests zu speichern. Im SRC -Verzeichnis habe ich den Pfad sitepointweather erstellt.

Wir erstellen zuerst das WeatherserviceInterface. Wetterdienste, die nicht existieren, werden diese Schnittstelle implementieren. In diesem Fall bieten wir nur eine Methode an, die uns die Temperatur von Celsius gibt.

<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Daher haben wir einen Service, der uns Celsius -Temperatur bietet. Ich möchte Fahrenheit bekommen. Dazu habe ich eine neue Klasse namens Temperaturenservice erstellt. Dieser Service wird Wetterdienste injizieren. Darüber hinaus definieren wir auch eine Methode, die Celsius in Fahrenheit umwandelt.

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Erstellen Sie Unit -Tests

Wir sind bereit, Unit -Tests einzurichten. Wir erstellen eine Temperaturerservicetest -Klasse im Testverzeichnis. In dieser Klasse erstellen wir die Methode testGetTempFahrenheit(), die unsere Fahrenheit -Methode testet.

Der erste Schritt in dieser Methode besteht darin, ein neues Temperaturservice -Objekt zu erstellen. So wie wir dies tun, fordert unser Konstruktor ein Objekt an, das das WeatherserviceInterface implementiert. Da wir noch kein Objekt haben (wir wollen es auch nicht), werden wir Spott verwenden, um ein Scheinobjekt für uns zu erstellen. Mal sehen, wie die Methode nach Abschluss aussieht.

namespace SitePoint\Weather;

interface WeatherServiceInterface
{
    /**
     * 返回摄氏温度
     *
     * @return float
     */
    public function getTempCelsius();
}
Nach dem Login kopieren

Wir erstellen zuerst das Scheinobjekt. Wir erzählen Spott, welches Objekt (oder die Schnittstelle) wir verspotten möchten. Der zweite Schritt besteht darin, die Methode zu beschreiben, die dieses Scheinobjekt aufgerufen wird. In der Methode shouldReceive() definieren wir den Namen der zu aufgerufenen Methode.

Wir definieren die Häufigkeit, mit der diese Methode aufgerufen wird. Wir können once(), twice() und times(X) verwenden. In diesem Fall erwarten wir, dass es nur einmal aufgerufen wird. Wenn nicht genannt oder übermäßige Anrufe aufgerufen werden, schlägt der Unit -Test fehl.

Schließlich definieren wir den Wert, der in der andReturn() -Methode zurückgegeben wird. In diesem Fall kehren wir 25 zurück. Spott verfügt auch über Rückgabethoden wie andReturnNull(), andReturnSelf() und andReturnUndefined(). Wenn Sie das erwarten, kann Spott auch Ausnahmen werfen.

Wir haben jetzt Scheinobjekte, mit denen unser Temperaturservice -Objekt erzeugt und wie gewohnt testen kann. 25 Grad Celsius ist 77 Grad Fahrenheit, daher prüfen wir, ob wir 77 von unserer getTempFahrenheit() -Methode erhalten.

Wenn Sie in Ihrem Root -Verzeichnis vendor/bin/phpunit tests/ ausführen, erhalten Sie ein grünes Licht von Phpunit, was darauf hinweist, dass alles perfekt ist.

Erweiterte Verwendung

Das obige Beispiel ist recht einfach. Keine Parameter, nur ein einfacher Anruf. Lassen Sie uns die Dinge komplizierter machen.

Angenommen, unser Wetterdienst hat auch eine Möglichkeit, die Temperatur zu den genauen Stunden zu erhalten. Wir fügen unserem aktuellen WeatherserviceInterface die folgende Methode hinzu.

namespace SitePoint\Weather;

class TemperatureService
{
    /**
     * @var WeatherServiceInterace $weatherService 保存天气服务
     */
    private $weatherService;

    /**
     * 构造函数。
     *
     * @param WeatherServiceInterface $weatherService
     */
    public function __construct(WeatherServiceInterface $weatherService) {
        $this->weatherService = $weatherService;
    }

    /**
     * 获取当前华氏温度
     *
     * @return float
     */
    public function getTempFahrenheit() {
        return ($this->weatherService->getTempCelsius() * 1.8000) + 32;
    }
}
Nach dem Login kopieren

Wir möchten wissen, wie die Durchschnittstemperatur zwischen 0 und 18:00 Uhr liegt. Dazu erstellen wir eine neue Methode bei Temperaturservice, um die Durchschnittstemperatur zu berechnen. Dazu holen wir 7 Temperaturen aus Weatherservice und berechnen den Durchschnitt.

<code>{
    "name": "sitepoint/weather",
    "license": "MIT",
    "type": "project",
    "require": {
        "php": ">=5.3.3"
    },
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require-dev": {
        "phpunit/phpunit": "4.1.*",
        "mockery/mockery": "0.9.*"
    }
}</code>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Schauen wir uns unsere Testmethode an.

<phpunit>
    <testsuite name="SitePoint Weather">
        <directory>./tests</directory>
    </testsuite>
    <listeners>
        <listener class="\Mockery\Adapter\Phpunit\TestListener"
                  file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"/>
    </listeners>
</phpunit>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Wir simulieren die Schnittstelle erneut und definieren die zu aufgerufene Methode. Als nächstes definieren wir die Häufigkeit, mit der diese Methode aufgerufen wird. Wir haben im vorherigen Beispiel once() verwendet, und jetzt verwenden wir times(7), um anzuzeigen, dass wir erwarten, dass diese Methode 7 -mal bezeichnet wird. Wenn die Methode nicht genau 7 Mal aufgerufen wird, schlägt der Test fehl. Wenn Sie den Hörer nicht in der Konfigurationsdatei phpunit.xml definieren, erhalten Sie keine Benachrichtigungen darüber.

Als nächstes definieren wir die

-Methode. In der Methode with() können Sie die von Ihnen erwarteten Parameter definieren. In diesem Fall erwarten wir 7 verschiedene Stunden. with

Schließlich haben wir die

-Methode. In diesem Fall geben wir 7 Rückgabewerte an. Wenn Sie weniger Rückgabewerte definieren, wird der letzte verfügbare Rückgabewert jedes Mal wiederholt. andReturn()

Natürlich kann Spott mehr tun. Für die vollständige Anleitung und Dokumentation empfehle ich Ihnen, die GitHub -Seite zu lesen.

Wenn Sie sich für den Code des obigen Projekts interessieren, können Sie diese GitHub -Seite überprüfen.

Schlussfolgerung

Mit Phpunit können Sie bereits Objekte verspotten. Sie können jedoch auch Spott verwenden, wie im obigen Beispiel erläutert. Wenn Sie Unit -Testen in Ihrer Klasse testen und nicht möchten, dass eine andere Klasse Ihre Tests beeinflusst, kann es Ihnen einfach helfen. Wenn Sie wirklich funktionale Tests durchführen möchten, ist es besser zu sehen, ob Sie echte Tests integrieren können. Verwenden Sie derzeit Phpunit -Simulation und überlegen Sie, ob Sie auf Spott wechseln? Möchten Sie in nachfolgenden Beiträgen mehr und größere Spottbeispiele sehen? Bitte lassen Sie es mich in den Kommentaren unten wissen.

FAQs über Spott- und Testabhängigkeiten (FAQ)

Was ist Spott und warum ist es für PHP -Tests wichtig?

Spott ist ein leistungsstarkes und flexibles PHP -Mock -Objekt -Objekt -Framework für Unit -Tests. Es ist als direkte Alternative zur Mock -Objektfunktionalität von Phpunit konzipiert. Mit Spott ermöglicht es Entwicklern, den getesteten Code zu isolieren und Test-Stand-Ins zu erstellen, die das Verhalten komplexer Objekte simulieren. Dies ist bei der Einheitstests von entscheidender Bedeutung, da sichergestellt wird, dass der getestete Code nicht von externen Faktoren oder Zustandszuständen abhängt.

Wie installiere und richte ich Spott in meinem PHP -Projekt ein?

Um Spott zu installieren, müssen Sie einen Komponisten haben, einen PHP -Abhängigkeits -Manager. Sie können Spott installieren, indem Sie den Befehl

ausführen. Nach der Installation können Sie Spott in der Testdatei einrichten, indem Sie in der Test -Teardown -Methode composer require --dev mockery/mockery aufrufen, um die Scheinobjekte zu bereinigen. Mockery::close()

Wie erstelle ich Scheinobjekte mit Spott?

Scheinobjekte in Spott erstellen ist einfach. Sie können die

-Methode verwenden, um ein Scheinobjekt zu erstellen. Zum Beispiel erstellt mock() ein Scheinobjekt für MyClass. $mock = Mockery::mock('MyClass');

Wie kann man die Erwartungen in Spott definieren?

In Spott definieren Sie die Erwartungen, indem Sie Methoden mit verspotteten Objekten verknüpfen. Zum Beispiel $mock->shouldReceive('myMethod')->once()->andReturn('mocked value'); Dieser Code zeigt Spott an, dass "MyMethod" einmal aufgerufen wird und "verspotteten Wert" zurückgeben sollte.

Was ist der Unterschied zwischen Simulation und Stummel in Spott?

In Spott ist ein Mock das Objekt, auf das wir das gewünschte festlegen können, während ein Stub ein Scheinobjekt ist, das eine vorprogrammierte Antwort hat. Wenn die Antwort das einzig Wichtige ist, werden normalerweise Stubs verwendet, und beim Testen der Interaktion selbst werden Mocks verwendet.

Wie kann man Spott verwenden, um private Methoden zu testen?

Es wird nicht empfohlen, private Methoden direkt zu testen, da es gegen das Kapselungsprinzip verstößt. Wenn Sie jedoch möchten, können Sie die shouldAllowMockingProtectedMethods() -Methode in Spott verwenden, um die verspotteten geschützten und privaten Methoden zu ermöglichen.

Wie kann man Konstruktorparameter in Spott umgehen?

Wenn die Klasse, die Sie simulieren möchten, Konstruktoren mit Argumenten enthält, können Sie sie als Array an die mock() -Methode übergeben. Zum Beispiel wird $mock = Mockery::mock('MyClass', [$arg1, $arg2]); $ arg1 und $ arg2 an den Konstruktor der MyClass weitergeben.

Wie kann man Spott verwenden, um statische Methoden zu simulieren?

Spott bietet eine Methode zum Simulieren statischer Methoden mit dem Präfix alias:. Beispielsweise erstellt $mock = Mockery::mock('alias:MyClass'); ein Scheinobjekt, mit dem die gewünschte Einstellung der statischen Methode der MyClass festgelegt werden kann.

Wie können Sie überprüfen, ob alle Erwartungen in Spott erfüllt werden?

Sie können die Mockery::close() -Methode in der Methode der Testmontage verwenden, um zu überprüfen, ob alle Erwartungen erfüllt wurden. Wenn keine Erwartungen erfüllt sind, wird Spott eine Ausnahme auswerfen.

Wie gehe ich mit Ausnahmen in Spott um?

Mit der Methode andThrow() können Sie das Mock -Objekt einrichten, um eine Ausnahme auszulösen. Zum Beispiel wird $mock->shouldReceive('myMethod')->andThrow(new Exception); eine Ausnahme auswerfen, wenn "MyMethod" aufgerufen wird.

Das obige ist der detaillierte Inhalt vonVerspottete Ihre Testabhängigkeiten mit Spott. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage