¿Es la envoltura de un código de un tercero la única solución para probar en unidad a sus consumidores?

13

Estoy haciendo pruebas de unidad y en una de mis clases necesito enviar un correo desde uno de los métodos, por lo que al usar Inyectador de inyección inyecto una instancia de la clase Zend_Mail que está en el marco Zend.

Ahora, algunas personas argumentan que si una biblioteca es lo suficientemente estable y no cambiará a menudo, entonces no es necesario envolverla. Entonces, suponiendo que Zend_Mail sea estable y no cambie y se ajuste a mis necesidades por completo, entonces no necesitaré una envoltura por ello.

Ahora eche un vistazo a mi clase Logger que depende 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
   }        
}

Sin embargo, las pruebas unitarias exigen que pruebe un componente a la vez, por lo que debo burlarme de la clase Zend_Mail . Además, estoy violando el principio Inversión de dependencia , ya que mi clase Logger ahora depende de la concreción y no de la abstracción.

Ahora, ¿cómo puedo probar Logger en forma aislada sin ajustar Zend_Mail ?!

El código está en PHP, pero las respuestas no tienen que serlo. Esto es más un problema de diseño que una característica específica del idioma

    
pregunta Songo 05.11.2012 - 22:35

1 respuesta

21

Siempre desea envolver tipos y métodos de terceros detrás de una interfaz. Esto puede ser tedioso y doloroso. A veces puedes escribir un generador de código o usar una herramienta para hacer esto.

Pero no se sienta tentado a usar los métodos o tipos de biblioteca en todo su código. Para empezar, tendrá problemas para escribir pruebas unitarias. Luego, la licencia cambiará, o querrá ir a una plataforma que no sea compatible con el tercero, y encontrará que esos tipos y dependencias se han tejido en todas sus otras clases.

La capacidad de cambiar rápidamente a proveedores externos es una gran ventaja.

    
respondido por el Ben 05.11.2012 - 22:42

Lea otras preguntas en las etiquetas