断言在磁带中抛出 - 节点
Asserting throws in tape - node
所以我正在尝试测试一个函数,它是一个客户端函数(未完成),这就是它嵌入测试本身的原因(直到我找到更好的解决方案)。
我遇到的问题是当我测试函数是否抛出 TypeError 时。
我知道这个问题是因为它正在测试 return 值而不是函数本身,我不确定如何解决这个问题。
感谢任何帮助!
磁带
test.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
的 return 值,如果抛出错误,则 false
不是 TypeError。如果你想在 GenerateRandomNumber
中保持你的 try/catch 和 return 为假,那么你不需要 throws
测试,而是像:
assert.equal(GenerateRandomNumber(0, 300, null), false, "Should catch the TypeError and return 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)。我仍在寻找以这种方式执行此操作的选项,但希望这对您现在有所帮助。
所以我正在尝试测试一个函数,它是一个客户端函数(未完成),这就是它嵌入测试本身的原因(直到我找到更好的解决方案)。
我遇到的问题是当我测试函数是否抛出 TypeError 时。
我知道这个问题是因为它正在测试 return 值而不是函数本身,我不确定如何解决这个问题。
感谢任何帮助!
磁带
test.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
的 return 值,如果抛出错误,则 false
不是 TypeError。如果你想在 GenerateRandomNumber
中保持你的 try/catch 和 return 为假,那么你不需要 throws
测试,而是像:
assert.equal(GenerateRandomNumber(0, 300, null), false, "Should catch the TypeError and return 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)。我仍在寻找以这种方式执行此操作的选项,但希望这对您现在有所帮助。