如何在Vitest中编写预期抛错的单元测试?测试失败求助
问题原因及修复方案
你的测试失败核心原因是异步函数的错误断言方式错误,另外还有一处细节可以优化:
1. 异步函数错误断言的核心问题
你当前的写法是:
expect(await workload.createWorkloadJSON()).toThrow(new Error('workload.json creating failed.'))
当异步函数抛出错误时,await会直接将错误抛出到当前作用域,导致expect还没执行toThrow逻辑,就已经触发了未处理的错误,测试自然失败。
针对异步函数的错误断言,有两种正确写法:
写法一:使用rejects匹配器
直接对Promise对象使用rejects.toThrow,无需提前await(建议加上await确保断言完成):
await expect(workload.createWorkloadJSON()).rejects.toThrow('workload.json creating failed.')
写法二:将异步逻辑包裹在回调函数中
把await操作放在expect的匿名异步回调里,让测试框架自动捕获错误:
expect(async () => { await workload.createWorkloadJSON() }).toThrow('workload.json creating failed.')
2. 可选优化:简化Mock实现
你当前的mock实现可以简化,不需要手动写async和抛出错误,直接用mockRejectedValue更简洁:
const spy = vi.spyOn(workload, 'createWorkloadJSON') .mockRejectedValue(new Error('workload.json creating failed.'))
修复后的完整测试代码
describe('workload', ()=>{ afterEach(()=>{ vi.restoreAllMocks() }) it('throws an error when workload.json is not found', async ()=>{ const spy = vi.spyOn(workload, 'createWorkloadJSON') .mockRejectedValue(new Error('workload.json creating failed.')) // 使用rejects匹配器的写法(推荐) await expect(workload.createWorkloadJSON()).rejects.toThrow('workload.json creating failed.') expect(spy).toHaveBeenCalled() }) })
内容的提问来源于stack exchange,提问作者Shu Pesmerga
相关产品推荐
相关产品推荐

