2011-08-11 3 views
9

Nodeunitを使用してNode.jsに書き込んでいるモジュールのテストスイートを作成しようとしています。このモジュールは、プレイリストにトラックを追加したり削除したりできる基本的な音楽プレイリストです。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(); 
} 

仮定は基本的にただのtry-catchステートメントでコードブロックをラップし、エラーブロックに対するキャッチをチェックして、私はtest.throwsを使用し、テストスイートを書いている間。どうやら私はNodeunitでテストを実行すると、ノードがエラーをキャッチしているテストスイートの代わりにモジュールによって投げられたエラーメッセージを表示するので、私は間違っています。私は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' 
); 

あなたは機能に渡す必要があり、実行されたときに、トラックを削除しようとします。こうすることで、プレイリストロジックは実際にはthrows関数によって実行されるため、try/catchブロックで自動的にラップすることができます。

+3

perfect、golden ....おそらくnodenitのreadmeに同様の例を追加する必要があります;) –

関連する問題