Bir üçüncü taraf kodunun sarılması, tüketicilerini birim test etmek için tek çözüm mü?


13

Birim sınaması yapıyorum ve sınıflarımdan birinde yöntemlerden birinden posta göndermem gerekiyor, bu yüzden yapıcı enjeksiyonunu kullanarak Zend_MailZend çerçevesindeki sınıf örneğini enjekte ediyorum .

Şimdi bazı insanlar bir kütüphane yeterince kararlıysa ve sık sık değişmeyecekse, onu sarmaya gerek olmadığını savunuyorlar. Bu nedenle Zend_Mail, istikrarlı olduğunu ve değişmeyeceğini ve ihtiyaçlarıma tamamen uyduğunu varsayarsak, bunun için bir sargıya ihtiyacım olmayacak.

Şimdi aşağıdakilere Loggerbağlı olan dersime göz atın 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
   }        
}

Ancak, Birim testi bir kerede bir bileşeni test etmemi gerektiriyor, bu yüzden Zend_Mailsınıfı taklit etmem gerekiyor . Ayrıca, sınıfım şimdi soyutlamaya değil, somutlaşmaya bağlı olduğu için Bağımlılık Tersine Çevirme ilkesini ihlal ediyorum Logger.

Şimdi Loggersarmadan izole olarak nasıl test edebilirim Zend_Mail?!

Kod PHP'dir, ancak yanıtların olması gerekmez. Bu, dile özgü bir özellikten ziyade bir tasarım sorunudur


Bir arayüz kullanmak zorunda mısınız? PHP ördek yazmayı desteklemiyor mu?
kevin cline

@kevincline iyi PHP kullandım çünkü en çok kullandığım dil, ama aslında sadece PHP ile sınırlı olmayan bir soruna genel bir çözüm arıyorum.
Songo

Yanıtlar:


21

Her zaman üçüncü taraf türlerini ve yöntemlerini bir arabirimin arkasına sarmak istersiniz. Bu sıkıcı ve acı verici olabilir. Bazen bir kod üreticisi yazabilir veya bunu yapmak için bir araç kullanabilirsiniz.

Ancak, kodunuz boyunca kütüphane yöntemlerini veya türlerini kullanmaya cazip gelmeyin. Başlangıç ​​olarak, birim testleri yazarken sorun yaşayacaksınız. Sonra bir lisans değişecek veya üçüncü tarafça desteklenmeyen bir platforma gitmek isteyeceksiniz ve bu tür ve bağımlılıkların diğer tüm sınıflarınızda ve çevresinde dokunduğunu göreceksiniz.

Üçüncü taraf satıcıları hızlı bir şekilde değiştirme yeteneği büyük bir avantajdır.


4
"Sizin tarafınızdan yazılmayan bir şey" biraz fazla. Standardın veya platformun bir parçası olan kütüphanelerin sarılması zordur. Örneğin, tüm .NET bileşenlerini sarmak istemezsiniz. Sarıcılar sadece arayüzlerden geçiyorsa veya kod üretiliyorsa, test yazma konusunda çok az fayda buldum. İçinde mantık varsa (çağrıları birleştirme vb.) Testler yardımcı olabilir.
Ben

3
Son cümle için seçildi.
Blrfl

1
Düzgün bir şekilde yeniden düzenleme yaparsanız, kütüphane olanaklarının tekrar tekrar kullanımı bir hizmet sınıfına dahil edilir. Önceden tanımlamaya gerek yok.
kevin cline

3
-1: Üçüncü taraf kitaplığının standartlaştırılmış bir API'nin bulunduğu bir hizmet sağladığı durumlar dışında, bu çok büyük bir zaman kaybıdır ve yalnızca kodu çoğaltarak sürdürülebilirliği azaltacaktır. Ayrıca, YAGNI.
Michael Borgwardt

1
@MichaelBorgwardt: Elbette, ancak bu durumda standart API sarıcı olur ve kütüphaneleri kolayca değiştirebilirsiniz.
Blrfl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.