O empacotamento de um código de terceiros é a única solução para testar seus consumidores?


13

Estou fazendo testes de unidade e, em uma das minhas classes, preciso enviar um email de um dos métodos, portanto, usando injeção de construtor, injeto uma instância da Zend_Mailclasse que está no framework Zend.

Agora, algumas pessoas argumentam que, se uma biblioteca é estável o suficiente e não muda frequentemente, não há necessidade de envolvê-la. Supondo que Zend_Mailseja estável e não mude e atenda totalmente às minhas necessidades, não precisarei de um invólucro.

Agora dê uma olhada na minha turma Loggerque depende 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
   }        
}

No entanto, o teste de unidade exige que eu teste um componente de cada vez; portanto, preciso zombar da Zend_Mailclasse. Além disso, estou violando o princípio da Inversão da Dependência, pois minha Loggerclasse agora depende da concreção e não da abstração.

Agora, como posso testar Loggerisoladamente sem quebrar Zend_Mail?!

O código está em PHP, mas as respostas não precisam ser. Isso é mais um problema de design do que um recurso específico do idioma


Você precisa usar uma interface? O PHP não suporta digitação de patos?
Kevin cline #

@ Kevincline Bem, eu usei o PHP porque é a linguagem que eu mais uso, mas na verdade estou procurando uma solução geral para o problema, não limitada apenas ao PHP.
Songo

Respostas:


21

Você sempre deseja agrupar tipos e métodos de terceiros atrás de uma interface. Isso pode ser entediante e doloroso. Às vezes, você pode escrever um gerador de código ou usar uma ferramenta para fazer isso.

Mas não fique tentado a usar os métodos ou tipos de biblioteca em todo o seu código. Para começar, você terá problemas para escrever testes de unidade. Em seguida, uma licença será alterada ou você desejará acessar uma plataforma não suportada por terceiros e descobrirá que esses tipos e dependências foram criados dentro e ao redor de todas as suas outras classes.

A capacidade de alterar rapidamente fornecedores de terceiros é uma enorme vantagem.


4
"Qualquer coisa não escrita por você" é um pouco demais. Bibliotecas que fazem parte do padrão ou plataforma são difíceis de quebrar. Você provavelmente não gostaria de agrupar todos os componentes .NET, por exemplo. Se os wrappers passarem pelas interfaces ou forem gerados por código, encontrei pouco benefício em escrever testes. Se houver lógica (combinando chamadas etc.), os testes podem ser úteis.
Ben

3
Votado para a última frase.
Blrfl 5/11

1
Se você refatorar adequadamente, qualquer uso repetitivo dos recursos da biblioteca será considerado em uma classe de serviço. Não há necessidade de defini-lo com antecedência.
Kevin cline #

3
-1: Exceto nos casos em que a biblioteca de terceiros fornece um serviço para o qual existe uma API padronizada, esse é um enorme desperdício de tempo e reduzirá a manutenção apenas com a duplicação do código. Além disso, YAGNI.
22812 Michael Borgwardt

1
@MichaelBorgwardt: Claro, mas nesse caso, a API padrão se torna o wrapper e você pode trocar as bibliotecas facilmente.
Blrfl
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.