2016-04-20 11 views
2

Ich versuche, meinen Kopf um Tests zu wickeln, und ich weiß, es ist einfacher als ich denke. Meine Vermutung ist, dass ich unweigerlich Probleme bekommen werde, weil ich den Code zuerst geschrieben habe und gerade jetzt Tests mache, anstatt einen testgetriebenen Entwicklungsprozess zu haben.Testmethoden, die nichts zurückgeben

Meine Frage bezieht sich auf Funktionen, die etwas wie das Einschließen von Dateien tun. Sie geben nichts zurück, aber sie tun etwas für das Skript als Ganzes. Ich kann schreiben, einen Test zu behaupten, dass die Datei (check_file_validity) vorhanden ist, und das wäre gerade nach vorne

<?php 

class Includer { 
    public function __construct() { 
     $this->include_file("/var/www/index.html"); 
    } 

    public function check_file_validity($file = "") { 
     // Check to see if the file exists 
     return true; // if exists 
    } 

    public function include_file($file = "") { 
     if ($this->check_file_validity($file)) { 
      include $file; 
     }   
    } 
} 

:

Lassen Sie uns sagen, dass ich eine Klasse, die eine Datei enthält.

Aber wäre es akzeptabel, einen Boolean auf der include_file-Funktion basierend darauf zurückzugeben, ob die Datei enthalten war oder nicht? Wäre das nicht ein redundanter Test, da im Grunde die gleiche Sache passiert, wenn die check_file_validity Funktion ausgeführt wird?

Ich sollte beachten, dass die Informationen, die angegeben werden, um die Datei zu enthalten, von der URL kommen, so dass keine Dateien hier außerhalb der Tests fest codiert werden würden (es sei denn, ich verspotte die $_GET Parameter).

Antwort

1

Generell kann man davon ausgehen, dass PHP-Funktionen sicher funktionieren und man sie nicht erneut testen muss. Wenn Sie den Code testen möchten, der eine Funktion wie include verwendet, ist es möglicherweise eine gute Idee, es zu umgehen. So ist der Code wie folgt aussehen könnte:

<?php 

class Includer { 
    public function __construct() { 
     $this->include_file("/var/www/index.html"); 
    } 

    public function check_file_validity($file = "") { 
     // Check to see if the file exists 
     return true; // if exists 
    } 

    public function include_file_if_exists($file = "") { 
     if ($this->check_file_validity($file)) { 
      $this->include_file($file); 
     }   
    } 

    public function include_file($file = "") { 
     include $file; 
    } 
} 

include_file_if_exists() Um zu testen, würden Sie einfach Ihre Klasse verspotten, so können Sie überprüfen, ob include_file() aufgerufen wurde oder nicht, und wenn sie bekam das richtige Argument.

Wie für include_file() selbst, ist es nicht notwendig, es zu testen, da es nur include umschließt.

+0

Würdest du sagen, dass der Code aufgebläht wird, was es aufgrund der hinzugefügten Funktionen auf lange Sicht schwieriger macht, Probleme aufzuspüren? Deine Antwort hilft mir zu verstehen, was zu tun ist, also danke dir dafür. – helllomatt

+0

Kommt drauf an. Normalerweise möchten Sie diese Art von Funktionalitäten gruppieren. Anstatt eine Include-Methode hinzuzufügen, sollten Sie ein wiederverwendbares Loader-Objekt in Betracht ziehen. Oder wenn Sie Textdateien parsen möchten, würden Sie eine 'Reader'-Klasse erstellen und diese anstelle von PHP-Rohfunktionen verwenden. Aber Sie müssen nicht alles testen. Und in Ihrem Fall wäre es vollkommen in Ordnung, "check_file_validity" zu testen. Aber ich wollte Ihnen zeigen, wie man Methoden mit solchen Funktionen noch testen kann, wenn die Logik komplizierter wird. –

Verwandte Themen