首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jest:卡住了[UnhandledPromiseRejection:这个错误要么是在异步函数中抛出而不是catch块造成的,

Jest:卡住了[UnhandledPromiseRejection:这个错误要么是在异步函数中抛出而不是catch块造成的,
EN

Stack Overflow用户
提问于 2022-08-12 19:07:56
回答 1查看 451关注 0票数 0

我正在尝试加载一个文件并在其中搜索特定的条件。如果文件没有任何条款,那么我需要抛出一条错误消息。这一切在代码中似乎都有效,但是当我创建Jest测试用例时,我开始收到消息:

[UnhandledPromiseRejection:此错误起源于在异步函数中抛出而没有catch块,或者拒绝使用.catch()处理的承诺。..。

所有东西都封装在一个try/catch块中,所以这个消息对我没有任何意义,我猜这可能是我在Jest中所做的事情的一个问题。我对Jest测试很陌生,所以如果能提供任何帮助,我将不胜感激。我已经隔离了测试,所以,我知道这是导致问题的原因。

测试用例:

代码语言:javascript
运行
复制
test('missing functions in file', () => {
  const input = 'no functions here'
  jest
    .spyOn(fs, 'readFile')
    .mockImplementation(() =>
      Promise.resolve(Buffer.from(input, 'utf-8').toString())
    )

  expect(async () => await loadFunctionsFromFile()).toThrowError(
    `No functions found in file.\nThey must have the format of '/* fn: */function' or '/* fn: */ function'.`
  )
})

我的代码正在测试:

代码语言:javascript
运行
复制
export async function loadFunctionsFromFile() {
  try {
    let flieText = await getFnTextFromFile(
      jsonTransformConfig.providedFunctionsFile
    )
    flieText += await getFnTextFromFile(jsonTransformConfig.addOnFunctionsFile)

    return flieText
  } catch (err: any) {
    throw errorHandler(err, 'loadFunctionsFromFile')
  }
}

async function getFnTextFromFile(fileName: string) {
  try {
    const fileText = await tryToGetFileText(fileName)
    const functionsText = tryToRemoveExtraText(fileText)

    return functionsText
  } catch (err: any) {
    throw errorHandler(err, 'getFnTextFromFile')
  }
}

async function tryToGetFileText(fileName: string) {
  try {
    let functionsText = await fs.readFile(fileName, 'utf-8')

    return functionsText
  } catch {
    throw new Error(`'${fileName}' not found`)
  }
}

// export async function getDynamicFunctions() {}
function tryToRemoveExtraText(functionsText: string) {
  try {
    // clean up special characters from file (CRLF, EoF)
    const cleanText = functionsText.replace(/\r\n/g, '\n').trimEnd()
    const normalizedText = replaceAll(
      cleanText,
      prettierSearchTerm,
      legacySearchTerm
    )

    let functionStart = normalizedText.indexOf(legacySearchTerm)
    if (functionStart === -1) {
      throw new Error(
        `No functions found in file.\nThey must have the format of '${legacySearchTerm}' or '${prettierSearchTerm}'`
      )
    }
    return normalizedText.substring(functionStart)
  } catch (err: any) {
    throw errorHandler(err, 'tryToRemoveExtraText')
  }
}

errorHandler函数只返回一个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-12 23:33:43

首先,fs.readFile不是不返回任何内容的同步操作,也不是承诺。

您可以使用fs.readFileSync代替,也可以使用回调。

下面是一个简单的例子,您可以这样测试它

代码语言:javascript
运行
复制
function myFileRead(file): Promise<string> {
  return new Promise((resolve, reject) => {
    try {
      return resolve(fs.readFileSync(file, 'utf8'));
    } catch (e) {
      reject(e.message);
    }
  });
}

describe('myFileRead',() => {
  it('should resolve', () => {
    jest.spyOn(fs, 'readFileSync').mockReturnValueOnce('File content');

    return expect(myFileRead('./file')).resolves.toBe('File content');
  });

  it('should reject', () => {
    jest.spyOn(fs, 'readFileSync').mockImplementationOnce(() => {
      throw new Error('File not found');
    });

    return expect(myFileRead('')).rejects.toBe(`File not found`);
  });
});

当您测试承诺是否拒绝或解决时,您可以使用expect().rejects/resolves,它也会返回承诺。要么您需要返回它,要么将async上下文和await作为

代码语言:javascript
运行
复制
it('should reject', async () => {
    jest.spyOn(fs, 'readFileSync').mockImplementationOnce(() => {
      throw new Error('File not found');
    });

    await expect(myFileRead('')).rejects.toBe(`File not found`);
    // Other expect maybe
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73338741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档