草庐IT

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

coder 2023-05-30 原文

我正在尝试为我使用 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 语句中,并根据错误 block 检查 catch。显然我错了,因为当我使用 Nodeunit 运行测试时,Node 显示模块抛出的错误消息,而不是测试套件捕获错误。我是否错误地使用了 test.throw 案例?

最佳答案

您对 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 block 中。

关于javascript - Nodeunit test.throws 似乎没有发现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7020489/

有关javascript - Nodeunit test.throws 似乎没有发现错误的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  3. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  6. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

  9. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  10. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

随机推荐