我的单元测试代码如下:
// function for my unit test to test exception
const mockServiceThrow = async () => { throw new Error('unit test error message'); };
const createContextAndDoc = () => new Promise((resolve, reject) => {
(async () => {
const res = await mockServiceThrow();
if (res === 1) resolve(1)
else reject(0);
})();
});
createContextAndDoc().catch((e) => {
console.log('--------');
console.log(e.message);
console.log('--------');
});
当我运行这个单元测试时:
./node_modules/.bin/jest local_modules/__test__/unhandledException.test.js
完整的输出如下:
RUNS local_modules/__test__/unhandledException.test.js
node:internal/process/promises:246
triggerUncaughtException(err, true /* fromPromise */);
^
[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "Error: unit test error message".] {
code: 'ERR_UNHANDLED_REJECTION'
}
不明白为什么上面写着“未处理”,我有.catch()。有什么建议吗?
发布于 2021-12-09 01:15:55
看起来您正在立即调用异步函数,这会导致单元测试错误,这是不可能的,因为承诺永远不会返回-因此.catch没有捕获任何内容。错误不是承诺链的一部分。
如果您想立即调用函数,您需要捕捉错误并拒绝它,这样承诺就完成了。
const mockServiceThrow = async () => { throw new Error('unit test error message'); };
const createContextAndDoc = () => new Promise((resolve, reject) => {
(async () => {
try {
const res = await mockServiceThrow();
if (res === 1) resolve(1)
else reject(0);
} catch (e) {
reject(e)
}
})();
});
createContextAndDoc().catch(e => {
console.log('------------------');
console.log(e.message);
console.log('--------')
})
您还可以稍微简化代码:
const mockServiceThrow = async () => { throw new Error('unit test error message'); };
const createContextAndDoc = async () => {
const res = await mockServiceThrow();
if(res === 1) {
return Promise.resolve(1)
} else {
return Promise.reject(0);
}
};
createContextAndDoc().catch(e => {
console.log('------------------');
console.log(e.message);
console.log('--------')
})
编辑:进一步解释承诺。
createContextAndDoc是一个返回承诺的函数。如果res === 1,则该承诺将解决,但如果res是其他内容,则拒绝接受。为了实现这一目标,mockServiceThrow承诺的问题必须得到解决。否则,您将无法获得res variable.If的任何值,这样您的承诺函数就永远不会满满(解决或拒绝)。
在您的示例中,mockServiceThrow失败并抛出一个错误,此错误不是您用新Promis创建的承诺的一部分。要确保您的承诺完成(解决或拒绝),您需要回调,否则错误并不是承诺的一部分。
简化的代码有一个异步函数,这样当mockServiceThrow失败时,它的一部分异步函数就是您想要捕获的。
https://stackoverflow.com/questions/70283416
复制相似问题