问题描述
如果确定可以处理catch的错误,如何在Jest中测试try / catch块?例如,我要测试此代码以从单独的文件中读取令牌。我想测试我的捕获量,但问题是我不知道如何在Jest中创建情况以使在Jest中处理错误。
const readToken = async () => {
try{
const readFile = await fs.readFile('./apiData.json');
const data = JSON.parse(readFile);
return data.token;
}catch(err){
throw err;
}
}
这是我的Jest代码,但是我认为它不能正常工作,因为在覆盖范围内,向我显示出catch(err)所在的行。
it('should return catch error',async (done) => {
try{
await readToken()
done()
}catch(e){
done(e);
}
})
解决方法
您可以嘲笑fs.readFile
使其为您抛出错误:
it('should handle a readFile error',async () => {
jest.spyOn(fs,'readFile')
.mockImplementation(async () => { throw new Error('Some error'); });
await expect(readToken()).rejects.toThrowError();
fs.readFile.mockRestore()
});
您可以对JSON.parse做同样的事情:
it('should handle a JSON.parse error',async () => {
jest.spyOn(JSON,'parse')
.mockImplementation(() => { throw new Error('Some error'); });
await expect(readToken()).rejects.toThrowError();
JSON.parse.mockRestore()
});
这两个测试都将使catch代码中的代码运行并提高测试范围。如果您想将错误记录到控制台而不是将其再次抛出在catch块中,则可以像这样测试它:
it('should handle a readFile error','readFile')
.mockImplementation(() => { throw new Error('Some error'); });
jest.spyOn(console,'error')
.mockImplementation();
await readToken();
expect(console.error).toHaveBeenCalled();
jest.restoreAllMocks();
});