如何在Jest中比对ENOENT错误?附TypeScript测试场景
如何在Jest中比对ENOENT错误?
针对你用ts-jest测试TypeScript异步文件读取函数readAsync的场景,要比对ENOENT(文件不存在)错误,Jest有几种很实用的方式,我给你整理了具体的实现方案:
方案1:用rejects匹配器快速断言
Jest自带的异步断言能力可以直接检查Promise是否抛出了符合特征的错误,代码写起来很简洁:
describe('Testing readAsync function', () => { test('should reject with ENOENT error when target file does not exist', async () => { // 传入一个确定不存在的文件名 await expect(readAsync('missing-file.json')).rejects.toThrow( expect.objectContaining({ code: 'ENOENT' }) ); }); });
这里的expect.objectContaining是关键,它能匹配到错误对象里包含code: 'ENOENT'这个属性——Node.js抛出的文件不存在错误都会带这个标识,刚好能精准命中我们要检测的场景。
方案2:手动捕获错误做精细化断言
如果你需要对错误做更细致的校验(比如检查错误消息里的文件名),可以手动捕获reject的错误,再逐一断言:
describe('Testing readAsync function', () => { test('should reject with ENOENT error when target file does not exist', async () => { try { await readAsync('missing-file.json'); // 如果代码走到这里,说明函数没抛出预期的错误,直接标记测试失败 fail('Expected readAsync to reject with an ENOENT error'); } catch (err) { // 先断言是Error实例 expect(err).toBeInstanceOf(Error); // 用TypeScript类型断言访问错误的code字段 const error = err as NodeJS.ErrnoException; expect(error.code).toBe('ENOENT'); // 额外校验错误消息里包含目标文件名,确保错误是对应文件导致的 expect(error.message).toContain('missing-file.json'); } }); });
这里要注意用NodeJS.ErrnoException做类型断言,因为TypeScript默认不知道错误对象有code属性,这个类型是Node.js内置的,专门用来描述系统级错误。
小提醒
- 测试前一定要确认传入的文件名对应的文件确实不存在,不然测试会出现假阳性结果。
- 你的
readAsync函数里用了join(__dirname, '../../__mocks__/')拼接路径,测试时要注意路径解析是否正确,避免因为路径问题误判错误类型。
内容的提问来源于stack exchange,提问作者Lucas Almeida Carotta
相关产品推荐
相关产品推荐

