簡體   English   中英

開玩笑:卡在 [UnhandledPromiseRejection:此錯誤源於在沒有 catch 塊的情況下拋出異步 function 內部,

[英]Jest: stuck on [UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block,

我正在嘗試加載文件並在其中搜索特定術語。 如果該文件沒有任何條款,那么我需要拋出一條錯誤消息。 這一切似乎都在代碼中工作,但是當我創建我的 Jest 測試用例時,我開始收到消息:

[UnhandledPromiseRejection:此錯誤源於在沒有 catch 塊的情況下拋出異步 function 內部,或拒絕未使用 .catch() 處理的 promise。 ...

一切都包裝在一個 try/catch 塊中,所以該消息對我來說沒有意義,我猜這可能是我在 Jest 中所做的事情的問題。 我是 Jest 測試的新手,因此我們將不勝感激。 我已經隔離了測試,所以我知道這是導致問題的原因。

測試用例:

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'.`
  )
})

我的代碼正在測試:

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 function 只是返回一個錯誤。

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

您可以改用fs.readFileSync或使用回調。

這是一個簡單的例子,這就是你如何測試它

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`);
  });
});

當您測試 promise 是否拒絕或解決時,您可以使用expect().rejects/resolves resolves 並且它也會返回 promise。 您需要返回它或使用async上下文並await

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

    await expect(myFileRead('')).rejects.toBe(`File not found`);
    // Other expect maybe
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM