我正在开发一个JavaScript项目,并且正在努力通过最终的单元测试,该单元测试本质上是检查给定输入是否无效,我的函数是否抛出错误。在某些背景下,它是处理用户权限的功能,并且可以在给定某些先决条件的情况下检查是否可以授予或拒绝某些权限。
我可以通过关于功能输出的所有测试,但是在错误处理方面遇到麻烦。有人告诉我我没有抛出错误,尽管多次检查自己是否确实抛出了错误。我将附上图片以尽可能地说明问题。
首先,我要抛出的错误对象定义如下:
function InvalidBasePermissionsError() {
this.name = 'InvalidBasePermissionsError';
this.message = "Invalid Base Permissions";
this.stack = Error().stack;
}
InvalidBasePermissionsError.prototype = Object.create(Error.prototype);
我的未通过抛出错误测试的函数如下:
PermissionDependencyResolver.prototype.canDeny = function (existing, permToDeny) {
try {
if (!pdr.checkValid(existing)) {
throw new InvalidBasePermissionsError;
}
else {
var tempArr = existing
var required = [];
for (var i = 0; i < tempArr.length; i++) {
var current_dependency = this.adjList[existing[i]];
required.push.apply(required, current_dependency)
};
if (required.includes(permToDeny)) {
return false;
} else {
return true;
}
}
}
catch (e) {
console.log(e.message)
}
};
奇怪的是,当我控制台登录时,功能如下:
pdr.canDeny(['create', "delete"], 'audit')
我在控制台上得到了正确的字符串“ Invalid Base Permissions”,请参见image1。更为奇怪的是,当我运行测试时,我看到相同的错误消息直接记录在“失败的测试”消息上方,这似乎是矛盾的,请参见image 2。 Mocha(测试框架)是否有可能不接受我的错误处理?还是我在函数中犯了一个错误并且没有适当地抛出该错误?
有问题的测试如下:
it('throws an exception when validating permissions if existing permissions are invalid', function(){
pdr = new PermissionDependencyResolver(complexPermissionDependencies)
expect(function () { pdr.canGrant(['edit', 'create'], 'alter_tags') }).toThrowError("Invalid Base Permissions")
expect(function () { pdr.canGrant(['view', 'delete'], 'alter_tags') }).toThrowError("Invalid Base Permissions")
expect(function () { pdr.canDeny(['create', 'delete'], 'audit') }).toThrowError("Invalid Base Permissions")
})
Mocha(测试框架)是否有可能不接受我的错误处理;还是我在函数中犯了一个错误并且没有适当地抛出该错误?
同样,当我手动控制台记录每个要测试的案例时,它们都会按预期抛出错误消息“ Invalid Base Permissions”。但是由于某种原因,测试告诉我什么也没扔。
关于可能导致此问题的任何想法都将提供巨大帮助,因为我对错误的根源一无所知。是Mocha,JS,我的try / catch语法还是其他问题。任何帮助都非常感谢。
谢谢!
答案 0 :(得分:0)
经过大量挖掘后设法找到答案,以防将来有人遇到类似问题时发帖。正确答案在这里:http://www.itjavascript.com/why-won-39-t-mocha-recognise-my-error-ask-question/
基本上,我在错误到达测试之前就进行了处理,因此删除try / catch语句可以解决问题。事后看来很愚蠢,但显然您需要对Mocha非常明确。希望将来对某人有用!