2012-03-05 23 views
6

Düğüm modüllerimin etrafında yüksek kaliteli testler yazmak için uğraşıyorum. Sorun, ihtiyaç modülü sistemidir. Gerekli bir modülün bir yöntemi veya durumu değiştiğini kontrol edebilmek istiyorum. Burada kullanılabilecek 2 tane nispeten küçük kütüphane var gibi görünmektedir: node-gently ve mockery. Ancak, düşük 'profilleri' nedeniyle, bu iki insanın bunu test etmediğini veya bunu bilmediğim başka bir yol olduğunu düşünmemi sağlıyor.Node.js'yi test etmek, gerekli olan bir modülü test etmek ve test etmek mi istiyorsunuz?

Gerekli olan bir modülü deneme ve sınamanın en iyi yolu nedir?

cevap

10

----------- GÜNCELLEME ---------------

node-sandbox işler aşağıda belirtildiği gibi ancak güzel bir modül içinde sarılır. Çalışmak çok güzel buluyorum.


--------------- detaylı Awnser ---------------

Ben çok deneme sonrasında Bir şeyleri alay ederken düğüm modülleri izole ederken test etmek için en iyi yolu bulmuştu Vojta Jina yöntemini kullanarak her modül bir vm içinde açıklandığı gibi yeni bir bağlam here açıklandığı gibi. Bu test vm modülü ile

:

var vm = require('vm'); 
var fs = require('fs'); 
var path = require('path'); 

/** 
* Helper for unit testing: 
* - load module with mocked dependencies 
* - allow accessing private state of the module 
* 
* @param {string} filePath Absolute path to module (file to load) 
* @param {Object=} mocks Hash of mocked dependencies 
*/ 
exports.loadModule = function(filePath, mocks) { 
    mocks = mocks || {}; 

    // this is necessary to allow relative path modules within loaded file 
    // i.e. requiring ./some inside file /a/b.js needs to be resolved to /a/some 
    var resolveModule = function(module) { 
    if (module.charAt(0) !== '.') return module; 
    return path.resolve(path.dirname(filePath), module); 
    }; 

    var exports = {}; 
    var context = { 
    require: function(name) { 
     return mocks[name] || require(resolveModule(name)); 
    }, 
    console: console, 
    exports: exports, 
    module: { 
     exports: exports 
    } 
    }; 

    vm.runInNewContext(fs.readFileSync(filePath), context); 
    return context; 
}; 

kendi bağlamı ile her modül test edip kolayca tüm dış dependencys saplama için mümkündür.

fsMock = mocks.createFs(); 
mockRequest = mocks.createRequest(); 
mockResponse = mocks.createResponse(); 

// load the module with mock fs instead of real fs 
// publish all the private state as an object 
module = loadModule('./web-server.js', {fs: fsMock}); 

Bu şekilde izolasyonda etkili testler yazmanızı tavsiye ederim. Sadece kabul testleri tüm yığına çarpmalıdır. Birim ve entegrasyon testleri sistemin izole kısımlarını test etmelidir.

+0

Harika cevap için teşekkürler! Ancak başka bir sorum var: Bu tekniği, test edilen modülde özel işlevlerimi kullanarak özel işlevleri geçersiz kılmak için kullanamamıştım. iki işlevle sonuçlanır: biri yerel kapsamda ve küresel kapsamda bir diğeri, test altındaki modül ile her zaman global/orijinal sürümü çağırır. – Attilah

5

Ben alay modeli iyi bir bence. Yani, genellikle bağımlılıkları bir fonksiyona parametreler olarak göndermeyi tercih ederim (kurucuda geçen bağımlılıklara benzer).

Test ederken, uygun görünüyorsa, sahte nesneleri, boş nesneleri gönderebilirim. Tüm bağımlılıklar için bunu yapmadığımı unutmayın, temelde sadece IO - Kodumun path.join numaranı ya da her neyse dediğini test etme gereği duymuyorum.

  • Bazı insanlar kendi yardımcısı aynı yerine sahip maden

    • Bazı insanlar benzer kodlarını yapısı:

      Gergin yapıyor "düşük profilli" bir kaç şey yüzünden olduğunu düşünüyorum mockery ve diğerlerinin hedefi (çok basit bir modül)

    • Bazı insanlar böyle bir şeyi test etmemektedir, bunun yerine uygulamalarının bir örneğini (ve db, vb.) döndürme ve buna karşı test etme gibi. Temizleyici testler ve sunucu çok hızlı test performansını etkilemez.

    Özetle, alay konusu sizin için uygunsa, bunun için gidin! Aynı ilkeleri üzerinde

  • +0

    sorun birim test ideal değildir veritabanını isabet olmasıdır. –

    +1

    @beck: Test ederken sadece gerçek bir db gönderirseniz. –

    1

    kolaylıkla "a" kullanarak gerektirir alay: bununla https://npmjs.org/package/a

    //Example faking require('./foo') in unit test: 
    var fakeFoo = {}; 
    var expectRequire = require('a').expectRequire; 
    expectRequire('./foo).return(fakeFoo); 
    
    
    //in sut: 
    var foo = require('./foo); //returns fakeFoo 
    
    İlgili konular