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:
- 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.
- Das Objekt existiert noch nicht. Sie k?nnen zuerst den Test erstellen und dann das endgültige Objekt erstellen.
- 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>
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>
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(); }
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 保存天氣服務(wù) */ private $weatherService; /** * 構(gòu)造函數(shù)。 * * @param WeatherServiceInterface $weatherService */ public function __construct(WeatherServiceInterface $weatherService) { $this->weatherService = $weatherService; } /** * 獲取當(dāng)前華氏溫度 * * @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
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()
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!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

H?ufige Probleme und L?sungen für den variablen PHP -Umfang umfassen: 1. Die globale Variable kann innerhalb der Funktion nicht zugegriffen werden, und sie muss bei der Verwendung des globalen Schlüsselworts oder Parameters übergeben werden. 2. Die statische Variable wird statisch deklariert und nur einmal initialisiert und der Wert wird zwischen mehreren Aufrufen beibehalten. 3.. Hyperglobale Variablen wie $ _get und $ _post k?nnen direkt in jedem Bereich verwendet werden, aber Sie müssen auf eine sichere Filterung achten. 4. Die anonymen Funktionen müssen über das Schlüsselwort verwenden, und wenn Sie externe Variablen ?ndern, müssen Sie eine Referenz übergeben. Das Beherrschen dieser Regeln kann dazu beitragen, Fehler zu vermeiden und die Code -Stabilit?t zu verbessern.

Um PHP -Datei -Uploads sicher zu verarbeiten, müssen Sie die Quelle und die Type und die Eingabe des Dateinamens und des Pfades überprüfen, Serverbeschr?nkungen festlegen und Mediendateien zweimal verarbeiten. 1. überprüfen Sie die Upload -Quelle, um CSRF durch Token zu verhindern, und erkennen Sie den realen MIME -Typ über die Finfo_file mithilfe der Whitelist -Steuerung. 2. Benennen Sie die Datei in eine zuf?llige Zeichenfolge um und bestimmen Sie die Erweiterung, um sie gem?? dem Erkennungstyp in einem Verzeichnis ohne Web zu speichern. 3. Die PHP -Konfiguration begrenzt die Hochladengr??e und das tempor?re Verzeichnis Nginx/Apache verbietet den Zugriff auf das Upload -Verzeichnis. 4. Die GD -Bibliothek stellt die Bilder neu, um potenzielle b?swillige Daten zu l?schen.

Es gibt drei g?ngige Methoden für den PHP -Kommentarcode: 1. Verwenden Sie // oder #, um eine Codezeile zu blockieren, und es wird empfohlen, // zu verwenden. 2. Verwenden Sie /.../, um Codebl?cke mit mehreren Zeilen zu wickeln, die nicht verschachtelt werden k?nnen, aber gekreuzt werden k?nnen. 3.. Kombinationskenntnisse Kommentare wie die Verwendung / if () {} / Um Logikbl?cke zu steuern oder um die Effizienz mit Editor -Verknüpfungsschlüssel zu verbessern, sollten Sie auf die Schlie?ung von Symbolen achten und das Verschachteln bei der Verwendung vermeiden.

AgneeratorinphpiSamemory-effizientes WaytoiterateOverlargedatasetsByyieldingValueatimeinsteadofReturningThemallatonce.1.GeneratorsusetheyieldKeywordtoproduktenvaluesonDemand, ReducingMemoryUsage.2.TheyareusefulforfulforfulfordlingBiglopploups, Lesebiglochen, Leselungen, Lesebigs, Leselung, oder

Der Schlüssel zum Schreiben von PHP -Kommentaren liegt in der Kl?rung des Zwecks und der Spezifikationen. Kommentare sollten "Warum" und nicht "was getan" erkl?ren, um Redundanz oder zu Einfachheit zu vermeiden. 1. Verwenden Sie ein einheitliches Format wie Docblock (/*/) für Klassen- und Methodenbeschreibungen, um die Lesbarkeit und die Kompatibilit?t der Werkzeuge zu verbessern. 2. Betonen Sie die Gründe für die Logik, z. B. warum JS -Sprünge manuell ausgeben müssen. 3. Fügen Sie eine übersichtsbeschreibung vor komplexem Code hinzu, beschreiben Sie den Prozess in Schritten und helfen Sie, die Gesamtidee zu verstehen. V. Gute Anmerkungen k?nnen die Kommunikationskosten senken und die Effizienz der Code -Wartung verbessern.

In PHP k?nnen Sie quadratische Klammern oder lockige Klammern verwenden, um Zeichenfolgenspezifikationsspezifische Indexzeichen zu erhalten, aber quadratische Klammern werden empfohlen. Der Index startet von 0 und der Zugriff au?erhalb des Bereichs gibt einen Nullwert zurück und kann keinen Wert zugewiesen; MB_SUBSTR ist erforderlich, um Multi-Byte-Zeichen zu verarbeiten. Zum Beispiel: $ str = "Hallo"; echo $ str [0]; Ausgabe H; und chinesische Zeichen wie Mb_Substr ($ str, 1,1) müssen das richtige Ergebnis erzielen. In den tats?chlichen Anwendungen sollte die L?nge der Zeichenfolge vor dem Schleifen überprüft werden, dynamische Zeichenfolgen müssen für die Gültigkeit verifiziert werden, und mehrsprachige Projekte empfehlen, Multi-Byte-Sicherheitsfunktionen einheitlich zu verwenden.

Toinstallphpquickly, usexampponwindowsorhomebrewonmacos.1.onwindows, download undInstallxampp, SelectComponents, Startapache und PlaceFilesinhtdocscs.2.Anternativ, manuellinstallphpfrfr

Tolearnphpeffectival, startbysettingupalocalerverenVironmentusexs -LikexamppandacodeeditorikevScode.1) InstallxamppForapache, MySQL und Php.SeacodeeditorForsyntaxSupport.3) testyourscludingveliktingveliktelaThbiliodble.Neclyble.NektFile
