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 失败时,它是您试图捕获的异步函数的一部分。