单元测试时如何解决控制台错误未处理的承诺拒绝?
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);
我有一个处理错误代码的方法:
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();
});
正在看这里:
首先,你的测试没有用。
您侦测到一个函数,然后调用它,并期望它被调用?
这相当于现实生活中的“我会打电话给我在另一个房间的妈妈,当她和我在同一个房间时,我预计会大喊 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);