我如何检查 Jest 中 try/catch 块的错误
How I can check error from try/catch block in Jest
如果我确定 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', async () => {
jest.spyOn(fs, 'readFile')
.mockImplementation(() => { throw new Error('Some error'); });
jest.spyOn(console, 'error')
.mockImplementation();
await readToken();
expect(console.error).toHaveBeenCalled();
jest.restoreAllMocks();
});
如果我确定 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', async () => {
jest.spyOn(fs, 'readFile')
.mockImplementation(() => { throw new Error('Some error'); });
jest.spyOn(console, 'error')
.mockImplementation();
await readToken();
expect(console.error).toHaveBeenCalled();
jest.restoreAllMocks();
});