javascript - 断言在磁带中抛出 - Node

标签 javascript node.js testing assert node.js-tape

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

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

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

感谢任何帮助!

胶带


测试.js

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 ){
        
    try{
      
      if(!tickets instanceof Array){
        throw new TypeError();
      }
      
      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;
      
    }catch(e){ return false; } 
    
  };
  
  assert.plan(4);
  
  
  var t1 = GenerateRandomNumber(0, 300, null);
  assert.equal(typeof t1, "boolean", "Should return a boolean - false");
  
  var t2 = GenerateRandomNumber(0, 300, [0,1,2,3,4]);
  assert.equal(typeof t2, "number", "Should return a typeof number");
  
  // HELP
  assert.throws(GenerateRandomNumber(0, 300, null), TypeError, "Should throw typeError");
  
  var t4 = GenerateRandomNumber(null, null, [0,1,2,3,4]);
  assert.equal(typeof t4, "number", "Should return a typeof number");
  
  
});

最佳答案

您的第一个问题是 !tickets instanceof Array 不是您想要的逻辑。它所做的是首先对 tickets 执行 not 操作,然后测试它是否是一个 instanceof Array。所以你真正想要的是:

if(!(tickets instanceof Array)){
   throw new TypeError();
}

下一个问题是,如您所说,您正在获取 GenerateRandomNumber 的返回值,如果引发错误,则返回值是 false 而不是 TypeError。如果你想在 GenerateRandomNumber 中保留你的 try/catch 并返回 false,那么你不需要 throws 测试,而是像这样:

assert.equal(GenerateRandomNumber(0, 300, null), false, "应该捕获 TypeError 并返回 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 的选项,因为在按预期传递函数时磁带的错误匹配非常奇怪(请参阅 this issue)。我仍在寻找以这种方式执行此操作的选项,但希望这对您现在有所帮助。

关于javascript - 断言在磁带中抛出 - Node ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34142011/

相关文章:

node.js - 无法使用express从nodejs请求对象访问文件

testing - 如何允许构建继续运行,即使 test_script stmt 之一失败?

python - 在 AWS Lambda 中测试 Python "Hello World"

javascript - 对每个数组成员进行计算

javascript - 将 jQuery 脚本存储在 JS 变量中

javascript - 与 onclick 事件一起使用时如何在 document.write() 函数中添加文本?

javascript - 如何更改 typescript 中的CSS样式?

javascript - 异步类型错误 : cb is not a function

python - 在python和nodejs中请求nasdaq.com

javascript - 使用 Protractor 以 Angular 不同路线截取屏幕截图