2011-08-11 4 views
9

Nodeunit을 사용하여 Node.js에 쓰고있는 모듈에 대한 테스트 슈트를 만들려고합니다. 이 모듈은 재생 목록에 트랙을 추가하고 제거 할 수있는 기본 음악 재생 목록입니다.Nodeunit test.throws가 오류를 catch하지 않는 것 같습니다

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(); 
} 

당신이. 그래서 여기

내 테스트 스위트가 전달되는 부정확 한 데이터를 기반으로 오류를 발생 장소가 볼 수 있듯이. 테스트 스위트를 작성하는 동안 가정은 기본적으로 그냥 시도-catch 문에서 코드 블록을 래핑하고 오류 블록에 대한 캐치를 검사로

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을 사용했다. 분명히 Nodeunit으로 테스트를 실행할 때 노드가 오류를 포착하는 테스트 슈트 대신 모듈에 의해 던져진 오류 메시지를 표시하기 때문에 분명히 틀 렸습니다. test.throw 케이스를 잘못 사용하고 있습니까?

답변

23

귀하의 test.throws 사용은 적절하지 않습니다. 당신은 당신이 무엇을 보면 : 당신은 playlist.removetrack('Imma error')을 실행 한 다음 그 결과를 전달하는

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

예외가있다, 그래서 만약에, 슬로우, 그 어느 때 실행되는 슬로우 발생합니다.

좀 더 같이해야합니다 :

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

당신은 함수에 통과해야 실행될 때, 트랙을 제거하려고합니다. 그렇게하면 재생 목록 로직이 실제로 throws 함수에 의해 실행되므로 try/catch 블록에 자동으로 래핑 될 수 있습니다.

+3

완벽한, 황금 .... 비슷한 예제가 nodeunit에 대한 readme에 추가되어야합니다;) –

관련 문제