我正在尝试加载一个文件并在其中搜索特定的条件。如果文件没有任何条款,那么我需要抛出一条错误消息。这一切在代码中似乎都有效,但是当我创建Jest测试用例时,我开始收到消息:
[UnhandledPromiseRejection:此错误起源于在异步函数中抛出而没有catch块,或者拒绝使用.catch()处理的承诺。..。
所有东西都封装在一个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函数只返回一个错误。
发布于 2022-08-12 23:33:43
首先,fs.readFile不是不返回任何内容的同步操作,也不是承诺。
您可以使用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`);
});
});当您测试承诺是否拒绝或解决时,您可以使用expect().rejects/resolves,它也会返回承诺。要么您需要返回它,要么将async上下文和await作为
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
});https://stackoverflow.com/questions/73338741
复制相似问题