You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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);
      }
    });
  });
});

关键说明

  1. 同步toThrow()仅能捕获同步执行时立即抛出的错误,异步错误(比如Promise reject、回调里的错误)不在此范畴内。
  2. 明确指定错误消息(而非只写toThrow())可以让测试更精准,避免误判其他类型的错误。

内容的提问来源于stack exchange,提问作者KoenLuytenUG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:55:17