node.16 上的开玩笑错误:ERR_UNHANDLED_REJECTION
jest error on node.16: ERR_UNHANDLED_REJECTION
我的单元测试代码是这样的:
// 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()。有什么建议吗?
看起来您正在立即调用异步函数,这会导致单元测试错误,而且这不会发生,因为永远不会返回 promise - 所以 .catch 没有捕捉到任何东西。该错误不是承诺链的一部分。
如果您想立即调用该函数,您需要捕获错误并拒绝它,以便 promise 完成。
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('--------')
})
编辑:对 promises 的进一步解释。
createContextAndDoc 是一个 returns 承诺的函数。如果 res === 1,该承诺会解决,但如果 res 是其他内容,则拒绝。要做到这一点,必须解决 mockServiceThrow 承诺的问题。否则,您将不会获得 res variable.If 的任何价值,然后您的 promise 函数将永远不会 fullfills(解决或拒绝)。
在您的情况下,mockServiceThrow 失败并抛出错误,此错误不是您使用新 Promis 创建的承诺的一部分。为确保您的承诺履行(解决或拒绝)您需要回调,否则错误不是承诺的一部分。
简化的代码有一个异步函数,因此当 mockServiceThrow 失败时,它是您试图捕获的异步函数的一部分。
我的单元测试代码是这样的:
// 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()。有什么建议吗?
看起来您正在立即调用异步函数,这会导致单元测试错误,而且这不会发生,因为永远不会返回 promise - 所以 .catch 没有捕捉到任何东西。该错误不是承诺链的一部分。
如果您想立即调用该函数,您需要捕获错误并拒绝它,以便 promise 完成。
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('--------')
})
编辑:对 promises 的进一步解释。
createContextAndDoc 是一个 returns 承诺的函数。如果 res === 1,该承诺会解决,但如果 res 是其他内容,则拒绝。要做到这一点,必须解决 mockServiceThrow 承诺的问题。否则,您将不会获得 res variable.If 的任何价值,然后您的 promise 函数将永远不会 fullfills(解决或拒绝)。
在您的情况下,mockServiceThrow 失败并抛出错误,此错误不是您使用新 Promis 创建的承诺的一部分。为确保您的承诺履行(解决或拒绝)您需要回调,否则错误不是承诺的一部分。
简化的代码有一个异步函数,因此当 mockServiceThrow 失败时,它是您试图捕获的异步函数的一部分。