Schlüsselpunkte der simulierten Objekteinheiten -Tests
Wenn Sie Teil des Entwicklungsteams sind, hängt Ihr Code normalerweise von dem Code Ihrer Teamkollegen ab. Aber was ist, wenn ihr Code momentan nicht verfügbar ist - beispielsweise sind Ihre Teamkollegen noch nicht fertig mit dem Schreiben? Oder was ist, wenn der Code, den Sie benötigen, andere externe Abhängigkeiten erfordert, die schwer zu setzen sind? Was ist, wenn Sie Ihren Code aufgrund anderer Faktoren, die Sie nicht kontrollieren können, nicht testen können? Würden Sie einfach rumhängen und nichts tun, darauf warten, dass Ihr Team fertig ist oder alles fertig ist? Natürlich nicht! In diesem Artikel werde ich erklären, wie Sie Code schreiben, um dieses Abhängigkeitsproblem zu lösen. Im Idealfall benötigen Sie Hintergrundkenntnisse über Unit -Tests, und es gibt bereits einen hervorragenden Einführungsartikel zu Unit -Tests von Michelle Saver auf SitePoint. Obwohl dieser Artikel nicht erforderlich ist, lesen Sie bitte meine anderen Artikel zu automatisierten Datenbanktests.
Fall eines simulierten Objekts
Wie Sie vielleicht vermutet haben, können verspottete Objekte die schwierigen Situationen lösen, die ich in der Einführung erwähnt habe. Aber was ist ein Scheinobjekt? Ein Scheinobjekt ist ein Ersatzobjekt, das die tatsächliche Implementierung des tatsächlichen Objekts ersetzt. Warum möchten Sie ein Ersatzobjekt anstelle eines echten Objekts? Scheinobjekte werden für Unit -Tests verwendet, um das laufende Verhalten realer Objekte in Testfällen zu simulieren. Durch die Verwendung ist die Funktionalität der von Ihnen implementierenden Objekte einfacher zu testen. Hier sind einige nützliche Situationen bei der Verwendung von Scheinobjekten:
-Objekts wurde noch nicht implementiert. Angenommen, Ihre Aufgabe besteht darin, einige Daten in der Datenbank zu verarbeiten. Sie können eine Form des Datenzugriffs auf ein Objekt oder ein Datenrepository aufrufen. Was ist jedoch, wenn die Datenbank noch nicht festgelegt ist? Was ist, wenn keine Daten verfügbar sind (ich habe zu oft zu oft begegnet) oder der Code, um die Datenbank abzufragen, wurde noch nicht geschrieben? Simulieren Sie Datenzugriffsobjekte simulieren reale Datenzugriffsobjekte, indem Sie einige vordefinierte Werte zurückgeben. Dadurch werden Sie vor der Einrichtung einer Datenbank, dem Finden von Daten oder dem Schreiben von Code, der eine Datenbank abfragt, erspart.
Simulationsobjekte in der Praxis
Jetzt, da wir wissen, was ein Scheinobjekt ist, schauen wir uns einige praktische Beispiele an. Wir werden die zuvor genannten einfachen Funktionen implementieren, z. B. Likes und Kommentare auf Facebook -Posts. Wir werden mit den folgenden Einheiten -Tests beginnen, um unsere Erwartungen darüber zu definieren, wie das Objekt aufgerufen wird und wie der Rückgabewert aussehen wird:
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { private $statusService; private $fbID = 1; public function setUp() { $this->statusService = new StatusService(); } public function testGetAnalytics() { $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02")); $this->assertEquals(array( "2012-01-01" => array( "comments" => 5, "likes" => 3, ), "2012-01-02" => array( "comments" => 5, "likes" => 3, ), "2012-01-03" => array( "comments" => 5, "likes" => 3, ), "2012-01-04" => array( "comments" => 5, "likes" => 3, ), "2012-01-05" => array( "comments" => 5, "likes" => 3, ) ), $analytics); } }
tun
<?php class StatuService { private $facebook; public function getAnalytics($id, $from, $to) { $post = $this->facebook->get($id); } }
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { // test here } class MockFacebookLibrary { public function get($id) { return array( // mock return from Facebook here ); } }
<?php class StatusService { // other lines of code public function setFacebook($facebook) { $this->facebook = facebook; } }
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { private $statusService; private $fbID = 1; public function setUp() { $this->statusService = new StatusService(); } public function testGetAnalytics() { $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02")); $this->assertEquals(array( "2012-01-01" => array( "comments" => 5, "likes" => 3, ), "2012-01-02" => array( "comments" => 5, "likes" => 3, ), "2012-01-03" => array( "comments" => 5, "likes" => 3, ), "2012-01-04" => array( "comments" => 5, "likes" => 3, ), "2012-01-05" => array( "comments" => 5, "likes" => 3, ) ), $analytics); } }
Der Test schlägt immer noch fehl, aber zumindest erhalten wir keine Fehler mehr über das Aufrufen von Methoden für Nicht-Objekte. Noch wichtiger ist, dass Sie gerade die Notwendigkeit gelöst haben, diese Abhängigkeit zu erfüllen. Sie können jetzt mit dem Schreiben von Business Logic für die von Ihnen zugewiesenen Aufgaben beginnen und den Test bestehen.
<?php class StatuService { private $facebook; public function getAnalytics($id, $from, $to) { $post = $this->facebook->get($id); } }
Gehen Sie einen Schritt weiter: Verwenden Sie Simulationsframework
Während Sie beim ersten Start handgefertigte Scheinobjekte verwenden können, müssen Sie, wie ich selbst entdeckte, als komplexer, möglicherweise ein echtes Scheinrahmen verwenden. In diesem Artikel werde ich zeigen, wie Sie das mit Phpunit gelieferte Scheinrahmen verwenden. Nach meiner Erfahrung gibt es einige Vorteile, wenn ein Mock -Framework im Vergleich zur Verwendung eines manuell geschriebenen Mock -Objekts:
verwendet wird:Simulations -Framework mit Phpunit
Konzentrieren wir uns nun auf das Simulationsrahmen mit Phpunit, die Schritte sind tatsächlich sehr intuitiv und sobald Sie das Verständnis dafür erhalten, wird es zur zweiten Natur. In diesem Abschnitt verwenden wir das Simulations -Framework von Phpunit, um ein Scheinobjekt für unseren Beispielfall zu erstellen. Bevor wir dies tun, kommentieren oder löschen Sie die Codezeile im Test, die unsere handgefertigten Scheinobjekte verwendet. Wir müssen zuerst scheitern, damit wir bestehen können. Später werden wir eine neue Simulationsimplementierung injizieren.
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { // test here } class MockFacebookLibrary { public function get($id) { return array( // mock return from Facebook here ); } }
Stellen Sie sicher, dass der Test beim Ausführen von Phpunit fehlschlägt. Denken Sie nun darüber nach, wie wir ein Objekt und die Methode, die wir anrufen möchten, manuell simulieren können. Was haben wir gemacht?
Der erste Schritt besteht darin, das zu simulierte Objekt zu identifizieren. In der obigen Analyse -Beispielfunktion simuliert wir die Facebook -Bibliothek. Wir machen das Gleiche wie im ersten Schritt.
Jetzt, da wir die zu verspottete Klasse definiert haben, müssen wir die Methoden in der zu verspotteten Klasse kennen und wenn Methoden vorhanden sind, geben wir die Parameter und Rückgabeteile an. Die grundlegende Vorlage, die ich in den meisten Fällen verwende, ist ungefähr wie folgt:
Wenden wir die gerade jetzt genannten Schritte auf unseren Beispieltest an. <🎜>
<?php class StatusServiceTest extends PHPUnit_Framework_TestCase { private $statusService; private $fbID = 1; public function setUp() { $this->statusService = new StatusService(); } public function testGetAnalytics() { $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02")); $this->assertEquals(array( "2012-01-01" => array( "comments" => 5, "likes" => 3, ), "2012-01-02" => array( "comments" => 5, "likes" => 3, ), "2012-01-03" => array( "comments" => 5, "likes" => 3, ), "2012-01-04" => array( "comments" => 5, "likes" => 3, ), "2012-01-05" => array( "comments" => 5, "likes" => 3, ) ), $analytics); } }
Nachdem wir das Mock Facebook -Objekt erneut erstellt haben, geben Sie es erneut in unseren Service ein:
<?php class StatuService { private $facebook; public function getAnalytics($id, $from, $to) { $post = $this->facebook->get($id); } }
Jetzt sollten Sie den Test erneut bestehen. Glückwunsch! Sie haben begonnen, mit Scheinobjekten zu testen! Hoffentlich können Sie die Hindernisse, denen Sie in den zukünftigen Abhängigkeiten begegnen, effektiver programmieren und vor allem loswerden.
Bilder aus Fotolien
(Der FAQ -Abschnitt zu Mock -Objekttests sollte hier hinzugefügt werden. Der Inhalt stimmt mit dem FAQ -Teil im Eingabetxt überein, muss jedoch geringfügig umschreiben und poliert werden, um Duplikation zu vermeiden)
Das obige ist der detaillierte Inhalt vonPHP Master | Eine Einführung in Scheinobjekttests. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!