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 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:
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.
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>
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>
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>
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>
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(); }
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.
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; } }
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>
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>
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.
-Methode. In der Methode with()
können Sie die von Ihnen erwarteten Parameter definieren. In diesem Fall erwarten wir 7 verschiedene Stunden. with
-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()
Wenn Sie sich für den Code des obigen Projekts interessieren, können Sie diese GitHub -Seite überprüfen.
Schlussfolgerung
FAQs über Spott- und Testabhängigkeiten (FAQ)
Wie installiere und richte ich Spott in meinem PHP -Projekt ein?
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()
-Methode verwenden, um ein Scheinobjekt zu erstellen. Zum Beispiel erstellt mock()
ein Scheinobjekt für MyClass. $mock = Mockery::mock('MyClass');
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.
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.
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.
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.
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.
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.
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!