单元测试时如何解决控制台错误未处理的承诺拒绝?

How to resolve console error unhandled promise rejection when unit testing?

我有一个处理错误代码的方法:

handleSignatureAppErrorCodes(code) {
    if (code === 10) {
      return this.handleError({
        message: 'Configuration error, contact administrator',
      });
    } else if (code === 11) {
      return this.handleError({ message: '
Certificate not available' });
    } else if (code === 20) {
      return this.handleError({ message: 'Wrong PIN, try again' });
    } else if (code === 21) {
      return this.handleError({ message: 'Key not found' });
    } else if (code === 22) {
      return this.handleError({ message: 'Certificate not found' });
    } else if (code === 23) {
      return this.handleError({ message: 'Unable to catch the key' });
    } else if (code === 99) {
      return this.handleError({
        message: 'Unknown error, contact administrator',
      });
    }
  }
 

handleError 方法:

 private handleError(error: any): Promise<any> {
    return Promise.reject(error.message || error);
  }

我正在用 Jest 编写单元测试,这就是我如何覆盖每个 if 语句(示例仅针对一个 if):

it('handleSignatureAppErrorCode 22', () => {
    const spy = jest.spyOn(service, 'handleSignatureAppErrorCodes');
    service.handleSignatureAppErrorCodes(22);
    expect(spy).toHaveBeenCalled();
  });

测试通过,但我有一个控制台错误,我不知道如何解决:

console.error
    Unhandled Promise rejection: Certificate not found ; Zone: ProxyZone ; Task: null ; Value: Certificate not found undefined

我试过像这样使用 mockRejectedValue 方法,但我会收到指向“新错误”的错误,而没有任何消息。

it('handleSignatureAppErrorCode 22', () => {
        const spy = jest.spyOn(service, 'handleSignatureAppErrorCodes').mockRejectedValue(new Error('Certificate not found'));
        service.handleSignatureAppErrorCodes(22);
        expect(spy).toHaveBeenCalled();
      });

正在看这里: , https://www.guidefari.com/jest-unhandled-promise-rejection/ 在其他地方有类似的例子,但没有运气。感谢帮助和指导!

首先,你的测试没有用。

您侦测到一个函数,然后调用它,并期望它被调用?

这相当于现实生活中的“我会打电话给我在另一个房间的妈妈,当她和我在同一个房间时,我预计会大喊 MOOOOOM”

所以,让我们做一个适当的测试:

it('Should return a given statement on error 22', (done) => {
  service.handleSignatureAppErrorCodes(22).catch((message) => {
    expect(message).toBe('Certificate not found');
    done();
  });
});

你不需要在这里模拟任何东西。 handleError 是私有的,这意味着您不应该直接测试它。这称为实现细节。

此外,由于您在此处捕获了错误,因此您也不应在控制台中看到它弹出。 2只鸟,一块石头!

EDIT 额外的语法使它看起来更好看(switch hare syntax-heavy):


const errorCodes = [];
errorCodes[22] = 'Certificate not found';
//  + The other ones
// ...
const errorMsg = errorCodes[code] ?? 'Default message';

return Promise.reject(errorMsg);