2011-08-11 12 views
9

मैं एक मॉड्यूल के लिए एक परीक्षण सूट बनाने की कोशिश कर रहा हूं जिसे मैं नोड्यूनिट का उपयोग करके नोड.जेएस में लिख रहा हूं। मॉड्यूल एक मूल संगीत प्लेलिस्ट है जो प्लेलिस्ट में ट्रैक जोड़ने और हटाने की अनुमति देता है।Nodeunit test.throws त्रुटि को पकड़ने में प्रतीत नहीं होता

var playlist = function(){ 
    this.__playlist = []; 
    this.__count = 0; 
}; 

playlist.prototype = { 
    addtrack:function(track){ 
     if(typeof track !== "object") throw new Error("Track needs to be an oject"); 
     this.__count++; 
     track.id = this.__count; 
     this.__playlist.push(track); 
     return this.__playlist; 
    }, 
    removetrack:function(trackid){ 
     if(typeof trackid !== "number") throw new Error("Pass in a numeric track id"); 
     var trackFound = false; 
     for(var i=0;i<this.__playlist.length;i++){ 
      var t = this.__playlist[i]; 
      if(t.id == trackid){ 
       trackFound = true; 
       this.__playlist.splice(i,1); 
      } 
     } 
     if(!trackFound) throw new Error("Track not found in the playlist"); 
     return this.__playlist 
    } 
} 

exports.playlist = function(){ 
    return new playlist(); 
} 

आप स्थानों है कि गलत डेटा के आधार पर त्रुटियों फेंक में।

तो यहाँ अपने परीक्षण सूट है पारित किया जा रहा देखते हैं देख सकते हैं।

var pl = require('./playlist'); 

exports.testPlaylistInit = function(test){ 
    var playlist = pl.playlist(); 
    test.equal(typeof playlist, 'object'); 
    test.done(); 
} 

exports.testAddingTracks = function(test){ 
    var playlist = pl.playlist(); 
    test.throws(playlist.addtrack(), Error, 'Should fail for blank track'); 
    var track = { 
     title: "Golly Sandra", 
     artist: "Eisley", 
     album: "Room Noises" 
    }; 
    tracks = playlist.addtrack(track); 
    test.equals(tracks[0],track); 
    test.equals(tracks[0].id,1) 
    test.done(); 
} 

exports.testRemoveingTracks = function(test){ 
    var playlist = pl.playlist(); 
    test.throws(playlist.removetrack('Imma error'), Error, 'Show fail for non-numeric track id'); 
    var track = { 
     title: "Golly Sandra", 
     artist: "Eisley", 
     album: "Room Noises" 
    }; 
    playlist.addtrack(track); 
    track = { 
     title: ".44 Calliber Love Letter", 
     artist: "Alexisonfire", 
     album: "Alexisonfire" 
    } 
    playlist.addtrack(track); 
    test.equals(playlist.removetrack(1)[0],track); 
    test.throws(playlist.removetrack(10), Error, 'Should fail for non-existant track'); 
    test.done(); 
} 

टेस्ट स्वीट लिख जब मैं test.throws इस्तेमाल किया के रूप में इस धारणा मूल रूप से सिर्फ एक कोशिश पकड़ बयान में कोड ब्लॉक लपेटता है और त्रुटि ब्लॉक के खिलाफ पकड़ जाँच करता है। जाहिर है, हालांकि मैं गलत हूं, क्योंकि जब मैं नोड्यूनिट के साथ परीक्षण चलाता हूं, तो नोड त्रुटि को पकड़ने वाले परीक्षण सूट के बजाय मॉड्यूल द्वारा फेंक दिया गया त्रुटि संदेश प्रदर्शित करता है। क्या मैं test.throw केस गलत तरीके से उपयोग कर रहा हूँ?

उत्तर

23

test.throws का आपका उपयोग बिल्कुल सही नहीं है। आप तुम्हारे पास क्या है पर नज़र डालें तो:, फेंकता को

test.throws(
    playlist.removetrack('Imma error'), 
    Error, 
    'Show fail for non-numeric track id' 
); 

आप playlist.removetrack('Imma error') को क्रियान्वित कर रहे हैं, और फिर उस का परिणाम गुजर इसलिए यदि कोई एक अपवाद है, यह होगा पहले फेंकता कभी क्रियान्वित किया जाता है।

तुम कुछ इस तरह अधिक करना चाहिए:

test.throws(
    function() { 
    playlist.removetrack('Imma error'); 
    }, 
    Error, 
    'Show fail for non-numeric track id' 
); 

आप एक समारोह में पारित करना होगा, कि जब मार डाला, ट्रैक को दूर करने की कोशिश करेंगे। इस तरह, आपकी प्लेलिस्ट तर्क वास्तव में फेंकने वाले फ़ंक्शन द्वारा निष्पादित किया जाता है, और इस प्रकार स्वचालित रूप से प्रयास/पकड़ ब्लॉक में लपेटा जा सकता है।

+3

सही, सुनहरा .... शायद इसी तरह का उदाहरण नोड्यूनिट के लिए रीडेमे में जोड़ा जाना चाहिए;) –

संबंधित मुद्दे