Frage

Auf die Gefahr ... geflammt sein, was den Vorteil hat Anrufe Methoden der Durchsetzung anstatt Funktionen in einem Kontext, wo der Kontext implizit ist.

In Anbetracht, dass die PHP-Syntax so hässlich ist es, Methoden für den Aufruf warum Schöpfer seiner würde PHPUnit Nutzung durchgesetzt haben?

Wenn der Rahmen ein globales „currentTestCase“ Objekt gesetzt hatte und dann im Zusammenhang transparent ausgefallen behauptet mit diesem Objekt, das wir schreiben werden:

assertEquals("blah", $text);

als auf die äquivalent dagegen, aber die ausführliche:

$this->assertEquals("blah", $text);

Was genau tun wir durch die Verwendung OO in diesem Zusammenhang erhalten.

Bitte erleuchte mich.

War es hilfreich?

Lösung

Da PHPUnit aus xUnit abgeleitet und das ist, wie xUnit es tut.

Warum xUnit tut es auf diese Weise? Ich bin froh, dass du gefragt. Der ursprüngliche Grund, wie Robert weist darauf hin, dass xUnit von Smalltalk kommt und wurde von JUnit in Java populär gemacht. Beide sind OO-oder-nichts-Sprachen, so dass sie keine andere Wahl hatten.

Dies ist nicht zu sagen, es gibt keine andere Vorteile. OO-Tests können vererbt werden. Dies bedeutet, wenn Sie eine Unterklasse testen möchten Sie alle Tests der Eltern laufen kann und außer Kraft setzen nur die Handvoll Testmethoden für die Verhaltensweisen, die Sie geändert haben. Dies gibt Ihnen eine hervorragende Abdeckung von Unterklassen ohne Testcode zu duplizieren.

Es ist einfach hinzuzufügen und assert Methoden in PHPUnit außer Kraft setzen. Nur Unterklasse PHPUnit_Framework_TestCase, Ihre eigenen assert Methoden schreiben und Ihre Testklassen von Ihrer neuen Unterklasse erben. Sie können auch Standard setup und teardown Methoden schreiben.

Schließlich garantiert es, dass die Methoden des Test-Framework werden nicht mit dem Ding kollidieren, die sie zu testen. Wenn der Test-Framework seine Funktionen in den Test nur entleert und Sie wollte etwas testen, die eine setup Methode hatte ... gut bist du in Schwierigkeiten.

Das heißt, ich Ihren Schmerz zu hören. Ein großer Test-Framework kann lästig und umständlich und spröde sein. Perl keine xUnit Stil verwenden, verwendet es einen Verfahrens Stil mit kurzen Testfunktionsnamen. Siehe Test :: Mehr für ein Beispiel. Hinter den Kulissen tut es genau das, was Sie vorgeschlagen, gibt es ein Singleton Testinstanz Objekt, das alle Funktionen nutzen. Es gibt auch eine Hybrid-prozeduralen assert Funktionen mit OO Testmethoden Modul namens Test :: Klasse die tut das beste aus beiden Welten.

  

In Anbetracht, dass die PHP-Syntax so hässlich ist es, Methoden für den Aufruf

Ich denke, man nicht den -> mag. Ich schlage vor, Sie lernen, damit zu leben. OO PHP ist so viel schöner als die Alternative.

Andere Tipps

Ein guter Grund ist, dass assertXXX als Methodennamen für die Benennung Zusammenstoß ein hohes Risiko hat.

Ein weiterer ist, dass es aus der abgeleitet ist xUnit Familie, die mit objektorientierten Sprachen befasst sich typischerweise - Smalltalk zunächst. Dies macht es einfacher, bezogen sich auf Ihre „Geschwister“ von z.B. Java und Ruby.

keine direkte Antwort, sondern als von PHPUnit 3.5, Sie haben nicht $this-> mehr zu schreiben. PHPUnit 3.5 hinzugefügt, um eine Funktionsbibliothek für Assertions, die Sie enthalten müssen

require_once 'PHPUnit/Framework/Assert/Functions.php';

Dann können Sie tun

assertEquals('foo', $bar);
Siehe

Sebastian Bergmann Blog-Post über sie

Mit den Testfällen in der Klasse-Verfahren spart Arbeit für PHPUnit. Wegen des Mangels an integrierten Intelligenz PHPUnit konnte nicht reine Testfunktionen finden oder zu handhaben. Nur mit der erkennen -> assert * () Nachrichten -in einem einfachen boolean Ketten- wieder die Verarbeitungslogik speichert (für PHPUnit, nicht den Testfall Autor). Es ist alles syntaktisches Salz, das Overhead spart von der PHPUnit / Simple Sicht.

Es wäre kein technisches Problem sein, Fehler zu erfassen / Warnmeldungen, Ausnahmen oder erkennen PHPs nativen assert () Erklärung. Es ist nicht getan, weil eine schwierige API mehr enterprisey aussieht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top