Nodeunit test.throws似乎没有发现错误

我正在尝试为使用Nodeunit在Node.js中编写的模块创build一个testing套件。 该模块是一个基本的音乐播放列表,允许添加和删除曲目的播放列表。

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

正如你所看到的,有些地方会根据传入的错误数据来抛出错误。

所以这里是我的testing套件。

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

在编写testing套件时,我使用了test.throws,因为假设基本上只是将代码块封装在try-catch语句中,并检查catch块和error块。 显然我错了,因为当我使用Nodeunit运行testing时,Node显示模块抛出的错误消息,而不是捕获错误的testing套件。 我错误地使用了test.throw的情况吗?

你使用test.throws是不太正确的。 如果你看看你有什么:

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

你正在执行playlist.removetrack('Imma error') ,然后把结果传给throws,所以如果有exception,它会在throws被执行之前发生。

你应该做更像这样的事情:

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

您必须传入一个函数,执行时将尝试删除轨道。 这样,播放列表逻辑实际上是由throws函数执行的,因此可以自动包装在try / catch块中。