使用Jest编写单元测试时如何正确处理异步RestError报错
问题根源
你遇到的问题由两个错误导致:
- async/await与done回调混用:Jest中如果测试用例使用async异步写法,不需要传入done参数,否则Jest会一直等待你手动调用done()才结束测试,你未调用done就会触发默认5000ms超时报错。
- 错误匹配逻辑错误:
rejects.toEqual()比较的是完整的Error实例对象,你拿字符串/普通Error实例和RestError实例比较,必然不相等。
正确代码
直接移除done参数,匹配RestError的name和message属性即可:
jest.unmock('./utils.js'); describe('test', () => { it('test', async () => { await expect(getAPISecretKey('testKey')).rejects.toMatchObject({ name: 'RestError', message: 'AKV10000: Request is missing a Bearer or PoP token.' }); }); });
也可以直接用toThrow匹配错误内容:
it('test', async () => { await expect(getAPISecretKey('testKey')).rejects.toThrow('AKV10000: Request is missing a Bearer or PoP token.'); });
可选优化(推荐)
你当前的测试调用了真实的Azure Key Vault接口,会受网络/环境影响,建议mock掉第三方依赖,测试速度更快也更稳定:
// Mock Azure Key Vault SDK jest.mock('@azure/keyvault-secrets', () => ({ SecretClient: jest.fn().mockImplementation(() => ({ getSecret: jest.fn().mockRejectedValue( Object.assign(new Error('AKV10000: Request is missing a Bearer or PoP token.'), { name: 'RestError' }) ) })) })); jest.unmock('./utils.js'); describe('test', () => { it('test', async () => { await expect(getAPISecretKey('testKey')).rejects.toMatchObject({ name: 'RestError', message: 'AKV10000: Request is missing a Bearer or PoP token.' }); }); });
内容的提问来源于stack exchange,提问作者SarangRN
相关产品推荐
相关产品推荐

