2013-03-10 38 views
17

Şu anda bir nodejs uygulaması için bazı testler yapıyorum. Nodejs'de "özel" yardımcı program işlevi nasıl test edilir

module.exports = function myModule(moduleParam) { 
    var someVar; 
    .... 
    .... 
    function helper(param) { 
     return param + someVar; 
    } 
    return { 
     doSomething: function (bar) { 
      .... 
      .... 
      var foo = helper(bar); 
      .... 
      .... 
     } 
    }; 
}; 

'yardımcı' işlevi yalnızca modülü içinde yararlıdır ve dışarıdan maruz gerektiğini varsayalım: Böyle bir modül olduğunu varsayalım.

Test etmek için 'en iyi uygulama' nedir? (Elbette, doSomething işlevini bir bütün olarak test edebilirim, ancak bu şekilde, "yardımcı" işlev, "kara kutu" tarzında belirli bir durumda test edilir.

Test çerçevesi olarak nodeunit kullanıyorum, bu ölçüm için, ancak ihtiyacım olanı değiştirebilirim.

+0

ı don Eğer örnekte

bu, bunu kullanan nasıl Hiç test edemediğinizi düşünün, çünkü yerel kapsam değişkenlerine – Bergi

+0

erişebilirsiniz. gerçekten testler yapıyorsanız, yalnızca ihraç edilecek başka bir işlevi ekleyebilecek bir işlev? – phenomnomnominal

+0

@phenomnomnominal, sadece bir 'test' global değişkeni tanımlanmışsa veya böyle bir şey yapılıyorsa dışa aktarılan bir işlev gibi bir şeyden mi bahsediyorsunuz? – ArtoAle

cevap

22

Bunu sınamanız gerekir. Birim testi kara kutu testi. Bu, sınadığınız tek şeyin, ortak arabirim olan sözleşme olduğunu gösterir.

Bunlar gibi özel işlevler yalnızca kamuya açık olanların yeniden oluşturulmasından kaynaklanabilir. Sonuç olarak, TDD'yi kullanırsanız, özel işlevleriniz örtük olarak sınanmış olur.

Bu yanlış hissedilirse, çoğu zaman yapınızın yanlış olması nedeniyle olur. O zaman, özel eşyalarınızı fazladan bir modüle taşımayı düşünmelisiniz.

+1

Düşünürdüğüm şey buydu (ve diğer yeniden kullanılabilir işlevler için yaptı). Bunların sadece refactoring'den gelebileceğine katlanmıyorum ... bir java özel yöntemi sadece kamuya açık olanların refakatinden mi çıkıyor? Sanmıyorum ki ... sanırım, 'bir modüle geçme' stratejisi kabul edilebilir olabilir, sadece bağımlılıkların geçerliliğinden kaybolan kapama kapsamı konusunda şüphem var, ki bu her zaman olduğundan emin değilim. iyi bir şey – ArtoAle

+0

Eğer TDD'ye göre kesinlikle devam ederseniz, Java'da bile her özel yöntem sadece bir (veya daha fazla) kamusal yöntemin yeniden yapılandırılmasının bir sonucu olacaktır. Ama her neyse, sanırım gitme yolu budur :-) –

+0

Bu terimin farkında değildim :) bu terim, sanırım cevabın doğru olduğunu düşünmektir. TDD hakkında bu tür bir 'açıklama' bulmak için bazı linkleri işaretleyebilir misiniz? Teşekkürler – ArtoAle

8

Testleri, ünite testi ve TDD'nin ötesinde kullanışlı bir araç olarak bulduğumdan beri (this SO answer iyi bir argüman yapar), sizinki gibi yardımcı olacak bir npm paket hazırladım: require-from.

modül-file.js:

function helper(param) { 
    return param + someVar; 
} 

module.exports = function myModule(moduleParam) { 
    var someVar; 
    .... 
    .... 
    return { 
     doSomething: function (bar) { 
      .... 
      .... 
      var foo = helper(bar); 
      .... 
      .... 
     } 
    }; 
}; 
module.helperExports = helper; 

ithal-file.js:

var requireFrom = require('require-from'); 
var helper = requireFrom('helperExports', './module-file')); 
var public = requireFrom('exports', './module-file')); // same as require('./module-file') 
+0

Mmm ...gerçekten benim sorum yok :) demek istedim - aracınızın "özel" ihracattan "kamu" dan ayrıldığından beri faydalı olduğunu kabul ediyorum - ama sorum şu: bu durumu TDD'de nasıl ele alacağımız hakkında daha fazla şey var - anladım ki maymun yama her şey, kod yazmak ve dürüst olmak için iyi bir uygulama olup olmadığını bilmek istedim, açık bir şekilde testin bir amacı için bir şeyi ihraç etmek gerçekten sevmediğim bir şeydir, çünkü TDD'yi daha çok Daha iyi, daha çok yeniden yazılabilir kod yazınız :) – ArtoAle

+0

En iyi uygulamalar, desenler gibi, koşullara bağlı. Geliştiricinin hala ticaret kararlarını dikkate alması ve yargıyı kullanması gerekiyor. İzolasyonda işlevsel birimlerin test edilmesi, kararlı bir kamu API'sinin sürdürülmesi ve nelerin açığa çıkarılmasının en aza indirilmesinin değerli olduğu göz önüne alındığında, kütüphane, kodun ayrı bir modülde ayıklanmasına bir alternatif sunmaktadır. örn .: İlgili kodu bir arada tutmak veya çıkartılan koda bağlı olarak diğer modüllerin riskini önlemek (büyük takımlarda gerçekleşir). Bu yüzden, cevap sizin için artık yararlı olmasa bile, gelecekte veya başka insanlarda olabilir. – DEADB17

+0

BTW: İlgili maymunun eklenmesi yok. Mekanizma, düzenli düğüm ihracatı ile aynıdır. – DEADB17

İlgili konular