PHPUnit - Wie man PDO vorbereitete Aussage vortäuscht

8

Ich versuche, eine Mapper-Klasse mit PHPUnit zu testen. Ich kann die PDO-Instanz, die in die Mapper-Klasse injiziert wird, leicht verspotten, aber ich kann nicht herausfinden, wie man die PreparedStatement-Klasse, wie sie von der PDO-Klasse erzeugt wird, verspotten kann.

In meinem Fall habe ich die PDO-Klasse erweitert, also habe ich das:

%Vor%

Der Punkt ist, dass Core_Db_Driver_PDOStatement nicht in den Konstruktor der PDO-Klasse injiziert wird, sondern statisch. Und selbst wenn ich das tue:

%Vor%

... es ist immer noch eine statische Instanziierung, da ich meine eigene verspottete Instanz der vorbereiteten Anweisungsklasse nicht weitergeben kann.

Irgendeine Idee?

Bearbeiten: Lösung, angepasst von der Antwort:

%Vor%     
FMaz008 17.03.2011, 12:47
quelle

1 Antwort

10

Wenn Sie sich über die PDO-Klasse lustig machen können, dann sollten Sie die PDO-Klasse und all ihre Abhängigkeiten ausspionieren. Es sollte nicht nötig sein, sich um die Anweisungsklasse oder den Konstruktor der PDO-Klasse zu kümmern, da Sie die Eingabe und Ausgabe über die Mocks definieren.

Sie benötigen also ein Mock-Objekt, das ein Mock-Objekt zurückgibt.

Es mag ein wenig verwirrend aussehen, aber da Sie nur testen sollten, was die getestete Klasse tut, und nichts anderes, können Sie mit all den anderen Teilen Ihrer DB-Verbindung ziemlich viel wegräumen.

In diesem Beispiel wollen Sie nur herausfinden:

  • Wird vorbereitet genannt?
  • Wird fetchAll aufgerufen, was prepare zurückgibt?
  • Ist das Ergebnis dieses Aufrufs zurückgegeben?

Wenn ja: Alles gut.

%Vor%     
edorian 17.03.2011, 15:09
quelle