![](/img/trans.png)
[英]UnhandledPromiseRejectionWarning: This error originated either by throwing inside of an async function without a catch block
[英]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.