【问题标题】:Nodeunit test.throws doesn't seem to catch the errorNodeunit test.throws 似乎没有发现错误
【发布时间】:2011-10-24 15:08:22
【问题描述】:

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

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 作为假设,基本上只是将代码块包装在 try-catch 语句中,并根据错误块检查 catch。显然我错了,因为当我使用 Nodeunit 运行测试时,Node 会显示模块抛出的错误消息,而不是测试套件捕获错误。我是否错误地使用了 test.throw 案例?

【问题讨论】:

    标签: javascript unit-testing node.js nodeunit


    【解决方案1】:

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

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

    您正在执行playlist.removetrack('Imma error'),然后将其结果传递给 throws,因此如果出现异常,它将在 throws 执行之前发生。

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

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

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

    【讨论】:

    • 完美的,金色的......也许应该将类似的示例添加到 nodeunit 的自述文件中;)
    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多