Il wrapping di un codice di terze parti è l'unica soluzione per testare i suoi utenti?

13

Sto facendo test unitari e in una delle mie classi ho bisogno di inviare una mail da uno dei metodi, quindi usando il constructor injection I inietto un'istanza di Zend_Mail class che è nel framework Zend.

Ora alcune persone sostengono che se una libreria è abbastanza stabile e non cambierà spesso, non è necessario avvolgerla. Quindi supponendo che Zend_Mail sia stabile e non cambierà e si adatta perfettamente alle mie esigenze, allora non avrò bisogno di un wrapper per questo.

Ora dai un'occhiata alla mia classe Logger che dipende da 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
   }        
}

Tuttavia, il test delle unità richiede di testare un componente alla volta, quindi devo prendere in giro la classe Zend_Mail . Inoltre sto violando il principio Dependency Inversion poiché la mia classe Logger ora dipende dalla concrezione e non dall'astrazione.

Ora come posso testare Logger in isolamento senza avvolgere Zend_Mail ?!

Il codice è in PHP, ma le risposte non devono essere. Si tratta più di un problema di progettazione rispetto a una funzione specifica della lingua

    
posta Songo 05.11.2012 - 22:35
fonte

1 risposta

21

Si desidera sempre avvolgere tipi e metodi di terze parti dietro un'interfaccia. Questo può essere noioso e doloroso. A volte puoi scrivere un generatore di codice o utilizzare uno strumento per farlo.

Ma non essere tentato di utilizzare i metodi o i tipi di libreria nel codice. Per cominciare, avrai problemi a scrivere i test unitari. Quindi una licenza cambierà, o ti consigliamo di andare su una piattaforma non supportata dalla terza parte, e scoprirai che quei tipi e dipendenze si sono intrecciati in tutte le altre classi.

La possibilità di cambiare rapidamente i fornitori di terze parti è un enorme vantaggio.

    
risposta data 05.11.2012 - 22:42
fonte

Leggi altre domande sui tag