Javascript 断言在磁带节点中抛出

Javascript 断言在磁带节点中抛出,javascript,node.js,testing,assert,node.js-tape,Javascript,Node.js,Testing,Assert,Node.js Tape,所以我尝试测试一个函数,它是一个客户端函数(unfinish),这就是为什么它被嵌入到测试本身中(直到我找到更好的解决方案) 我遇到的问题是当我测试函数是否抛出TypeError时 我理解问题是因为它正在测试返回值,而不是函数本身,我不确定如何解决这个问题 感谢您的任何帮助 胶带 test.js 你的第一个问题是!数组的票证实例不是您想要的逻辑。它首先对票据执行not操作,然后测试这是否是数组的实例。所以你真正想要的是: if(!(tickets instanceof Array)){

所以我尝试测试一个函数,它是一个客户端函数(unfinish),这就是为什么它被嵌入到测试本身中(直到我找到更好的解决方案)

我遇到的问题是当我测试函数是否抛出TypeError时

我理解问题是因为它正在测试返回值,而不是函数本身,我不确定如何解决这个问题

感谢您的任何帮助

胶带
test.js
你的第一个问题是
!数组
的票证实例不是您想要的逻辑。它首先对
票据执行not操作,然后测试这是否是数组的
实例。所以你真正想要的是:

if(!(tickets instanceof Array)){
   throw new TypeError();
}
下一个问题是,正如您所说,您将获得
GenerateRandomNumber
的返回值,如果抛出错误,它将是
false
而不是TypeError。如果希望在
GenerateRandomNumber
中保持try/catch并返回false,则不需要
抛出测试,而是需要类似以下内容:

assert.equal(GenerateRandomNumber(0,300,null),false,“应该捕获类型错误并返回false)

如果要使用
assert.throws
,则需要从
GenerateRandomNumber
中删除try/catch,并执行以下操作:

var test  = require('tape');


test('GenerateRandomNumber Tests', function(assert){  

  /**
   * Generates a random number between the min/max
   * @param {int} the min value 
   * @param {int} the max value 
   * @param {array} list of values already stored
   * @return {mixed} int if success, false if exception thrown
  **/
  var GenerateRandomNumber = function( min, max, tickets ){
      if(!(tickets instanceof Array)){
        throw new TypeError('error');
      }

      min = (min) || 0;
      max = (max) || 200;

      var n = 0;

      n = ~~(Math.random() * (max - min) + min); 

      if(tickets.indexOf(n) === 1){
        GenerateRandomNumber(min, max);
      }

      return n;
  };

  assert.plan(3);

  var t2 = GenerateRandomNumber(0, 300, [0,1,2,3,4]);
  assert.equal(typeof t2, "number", "Should return a typeof number");

  // You must wrap GenerateRandomNumber from within another function 
  //so that the error being thrown doesn't cause the program to exit
  assert.throws(() => GenerateRandomNumber(0, 300, null), /error/, "Should throw typeError");

  var t4 = GenerateRandomNumber(null, null, [0,1,2,3,4]);
  assert.equal(typeof t4, "number", "Should return a typeof number");


});

我使用该选项来传递RegExp,因为磁带在按预期传递函数时匹配错误是非常奇怪的(请参阅).我仍在寻找一个这样做的选项,但希望现在能帮到你。

磁带捕获可能会有帮助吗?链接:我会调查一下,谢谢@jamesonyu,你到底希望发生什么?我运行了这个,所有测试都通过了。你是否希望
断言.throws
失败?如果你注释掉
throw new TypeError
,测试仍将通过。这不是期望的行为。我确信
assert.throws
方法正在评估返回值,而不是评估函数本身。@cojomojo
var test  = require('tape');


test('GenerateRandomNumber Tests', function(assert){  

  /**
   * Generates a random number between the min/max
   * @param {int} the min value 
   * @param {int} the max value 
   * @param {array} list of values already stored
   * @return {mixed} int if success, false if exception thrown
  **/
  var GenerateRandomNumber = function( min, max, tickets ){
      if(!(tickets instanceof Array)){
        throw new TypeError('error');
      }

      min = (min) || 0;
      max = (max) || 200;

      var n = 0;

      n = ~~(Math.random() * (max - min) + min); 

      if(tickets.indexOf(n) === 1){
        GenerateRandomNumber(min, max);
      }

      return n;
  };

  assert.plan(3);

  var t2 = GenerateRandomNumber(0, 300, [0,1,2,3,4]);
  assert.equal(typeof t2, "number", "Should return a typeof number");

  // You must wrap GenerateRandomNumber from within another function 
  //so that the error being thrown doesn't cause the program to exit
  assert.throws(() => GenerateRandomNumber(0, 300, null), /error/, "Should throw typeError");

  var t4 = GenerateRandomNumber(null, null, [0,1,2,3,4]);
  assert.equal(typeof t4, "number", "Should return a typeof number");


});