如何让Jest测试捕获"Permission denied"权限拒绝错误?
解决Jest无法捕获Node HTTP服务器异步启动错误的问题
你的测试失败的核心原因是**startServer是异步操作**,错误不会在同步执行流中抛出,而你当前用的是同步的expect(() => {...}).toThrow()写法,自然捕获不到异步产生的错误。
针对异步函数的解决方案
如果startServer返回Promise(现代Node.js库常用的异步方式),直接用Jest的rejects.toThrow()配合await即可:
describe('On any platform', (): void => { it('throws an error when trying to start with an invalid socket Path.', async(): Promise<void> => { const factory = new BaseHttpServerFactory(handler, httpOptions); // 直接断言异步操作会reject,并抛出指定错误 await expect(factory.startServer('/fake/path')).rejects.toThrow('EACCES: Permission denied \'/fake/path\''); }); });
针对回调风格异步函数的解决方案
如果startServer采用传统回调模式(比如startServer(path, (err) => {...})),可以用Jest的done回调来处理:
describe('On any platform', (): void => { it('throws an error when trying to start with an invalid socket Path.', (done): void => { const factory = new BaseHttpServerFactory(handler, httpOptions); factory.startServer('/fake/path', (err) => { try { expect(err).toBeInstanceOf(Error); expect(err.message).toContain('EACCES: Permission denied \'/fake/path\''); done(); } catch (testErr) { done(testErr); } }); }); });
关键说明
- 同步
toThrow()仅能捕获同步执行时立即抛出的错误,异步错误(比如Promise reject、回调里的错误)不在此范畴内。 - 明确指定错误消息(而非只写
toThrow())可以让测试更精准,避免误判其他类型的错误。
内容的提问来源于stack exchange,提问作者KoenLuytenUG
相关产品推荐
相关产品推荐

