Ich mache Unit-Tests und in einer meiner Klassen muss ich eine Mail von einer der Methoden senden, also füge ich mit Hilfe der Konstruktorinjektion eine Instanz der Zend_Mail
Klasse ein, die im Zend-Framework ist.
Nun argumentieren einige Leute, wenn eine Bibliothek stabil genug ist und sich nicht oft ändert, besteht keine Notwendigkeit, sie zu verpacken. Vorausgesetzt, das Zend_Mail
ist stabil und ändert sich nicht und es passt sich meinen Bedürfnissen an, dann brauche ich keinen Wrapper dafür.
Schauen Sie sich jetzt meine Klasse an Logger
, die davon abhängt Zend_Mail
:
class Logger{
private $mailer;
function __construct(Zend_Mail $mail){
$this->mail=$mail;
}
function toBeTestedFunction(){
//Some code
$this->mail->setTo('some value');
$this->mail->setSubject('some value');
$this->mail->setBody('some value');
$this->mail->send();
//Some
}
}
Beim Unit-Test muss jedoch jeweils eine Komponente getestet werden, sodass ich mich über die Zend_Mail
Klasse lustig machen muss . Außerdem verstoße ich gegen das Prinzip der Abhängigkeitsinversion , da meine Logger
Klasse jetzt von Konkretion und nicht von Abstraktion abhängt.
Wie kann ich nun Logger
isoliert testen, ohne zu verpacken Zend_Mail
?
Der Code ist in PHP, aber Antworten müssen nicht sein. Dies ist eher ein Designproblem als eine sprachspezifische Funktion
Antworten:
Sie möchten immer Typen und Methoden von Drittanbietern hinter einer Schnittstelle einschließen. Dies kann mühsam und schmerzhaft sein. Manchmal können Sie einen Codegenerator schreiben oder ein Tool verwenden, um dies zu tun.
Aber seien Sie nicht versucht, die Bibliotheksmethoden oder -typen im gesamten Code zu verwenden. Zunächst werden Sie Probleme haben, Komponententests zu schreiben. Dann ändert sich eine Lizenz, oder Sie möchten zu einer Plattform gehen, die nicht von einem Drittanbieter unterstützt wird, und Sie werden feststellen, dass diese Typen und Abhängigkeiten in und um alle Ihre anderen Klassen gewebt haben.
Die Möglichkeit, Drittanbieter schnell zu wechseln, ist ein enormer Vorteil.
quelle