Fehlerbedingungen in der mysqli-Bibliothek gefälscht

8

Ich habe eine Vielzahl von PHP-Skripten, die die mysqli -Suite von Funktionen verwenden, um auf eine Datenbank zuzugreifen. Ich habe diese Skripts geschrieben, um die verschiedenen Fehlerbedingungen zu behandeln (z. B. mysqli_stmt_execute gibt false zurück).

Gibt es eine einfache Möglichkeit, diese Fehlerbedingungen so zu fälschen, dass die vom Benutzer empfangene Ausgabe für diese Bedingungen geeignet ist?

    
Ed Heal 27.07.2012, 12:08
quelle

4 Antworten

8

Wenn Sie die mysqli-Klassen verwenden.

zum Beispiel:

%Vor%

Verspotten Sie die Klassen und überschreiben Sie die Anweisung execute.

%Vor%

Alles was Sie ändern müssen, damit jede Execute-Methode false zurückgibt, ist:

%Vor%

Wenn Sie stattdessen die Funktionen verwenden

zum Beispiel:

%Vor%

Monkey-Patch im Namensraum php & gt; = 5.3

%Vor%

Ihr Skript wird my_faking_namespace\mysqli_stmt_execute() anstelle der PHP-Version aufrufen.

Hinweis: Dies funktioniert nicht, wenn Sie die Funktionen wie \mysqli_stmt_execute() aufrufen, da diese Version explizit den globalen Namespace aufruft.

Die nicht so einfachen Alternativen, zu Komplettierungszwecken

Diese ändern die Funktionen auf der Call-Stack-Ebene und ändern php intern durch die Verwendung von benutzerdefinierten Erweiterungsmodulen (erfordert eine Installation).

  • Erweiterter PHP-Debugger hat override_function() und rename_function()
  • runkit hat runkit_function_copy , runkit_function_redefine , runkit_function_remove , runkit_function_rename und kann sich ändern so ziemlich alles, was du begehrst.

nJoy!

    
nickl- 26.08.2012, 06:32
quelle
1

Wenn Sie nach automatischen Tests suchen, ist der beste Weg (mit PHP) PHPUnit .

Mit PHPUnit können Sie Komponententests (insbesondere Assertions) schreiben, mit denen Sie überprüfen können, ob die vom Benutzer empfangene Ausgabe unter verschiedenen Bedingungen geeignet ist.

    
bitfox 25.08.2012 23:03
quelle
0

Wenn Sie sich nicht in einer Produktionsumgebung befinden, ändern Sie am besten die verschiedenen Datenbankparameter in Ihrem PHP.

  • Ändern Sie das Datenbankkennwort, um zu sehen, wie Sie mit Verbindungsfehlern umgehen
  • Ändern Sie Ihre Tabellenstrukturen, um zu sehen, wie Sie mit Abfragefehlern umgehen
  • Versuchen Sie zu sehen, was mit Sonderzeichen (zB: буква) in Ihren Abfragen passiert
Tchoupi 27.07.2012 12:16
quelle
0

Vielleicht stellen Sie die falsche Frage: Warum hängt Ihre Kerngeschäftslogik von Bibliotheken / APIs von Drittanbietern ab? Hast du von der sogenannten Zwiebelarchitektur gehört? Wenn Sie Ihre Anwendung mehr auf diese Bereiche aufteilen - Domain, Business, Infrastruktur / Tests -, können Sie die Dinge, die sich nicht ändern, viel einfacher testen: Ihre Geschäftslogik.

Da PHP jedoch eine dynamisch typisierte Sprache ist, ist Spott im Wesentlichen frei. Solange Sie OO-Funktionen und nicht die globalen Funktionen verwenden, ist alles, was Sie testbaren Code erstellen müssen, eine Möglichkeit, einen falschen Datenbank-Handle in Ihren Code zu injizieren. Ein guter Weg ist, einen $db Parameter zu Ihren Funktionen / Methoden hinzuzufügen. Etwas triviales wie folgt:

%Vor%

Übergeben Sie dann in Ihren Unit-Tests, die updateStuff abdecken, ein Mock-Objekt als $db -Parameter.

    
EthanB 26.08.2012 06:53
quelle

Tags und Links