Je fais des tests unitaires et dans l'une de mes classes, je dois envoyer un courrier à partir d'une des méthodes, donc en utilisant l'injection de constructeur j'injecte une instance de Zend_Mail
classe qui est dans le framework Zend.
Maintenant, certaines personnes soutiennent que si une bibliothèque est suffisamment stable et ne change pas souvent, il n'est pas nécessaire de la boucler. Donc, en supposant que cela Zend_Mail
soit stable et ne changera pas et qu'il correspond entièrement à mes besoins, je n'aurai pas besoin d'un wrapper pour cela.
Jetez maintenant un œil à ma classe Logger
qui dépend de 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
}
}
Cependant, les tests unitaires exigent que je teste un composant à la fois, donc je dois me moquer de la Zend_Mail
classe. De plus, je viole le principe de l' inversion de dépendance car ma Logger
classe dépend maintenant de la concrétion et non de l'abstraction.
Maintenant, comment puis-je tester Logger
de manière isolée sans envelopper Zend_Mail
?!
Le code est en PHP, mais les réponses ne doivent pas nécessairement l'être. Il s'agit plus d'un problème de conception que d'une fonctionnalité spécifique à une langue
Réponses:
Vous voulez toujours envelopper les types et méthodes tiers derrière une interface. Cela peut être fastidieux et douloureux. Parfois, vous pouvez écrire un générateur de code ou utiliser un outil pour ce faire.
Mais ne soyez pas tenté d'utiliser les méthodes ou types de bibliothèque dans votre code. Pour commencer, vous aurez du mal à écrire des tests unitaires. Ensuite, une licence changera, ou vous voudrez aller sur une plate-forme non prise en charge par le tiers, et vous constaterez que ces types et dépendances se sont tissés dans et autour de toutes vos autres classes.
La possibilité de changer rapidement de fournisseurs tiers est un énorme avantage.
la source