我如何从Jest的try / catch块检查错误

问题描述

如果确定可以处理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();
  });

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...