Javascript 在Jest中测试包含Promise和FileReader()的函数
当前正在尝试测试以下功能:Javascript 在Jest中测试包含Promise和FileReader()的函数,javascript,reactjs,testing,mocking,jestjs,Javascript,Reactjs,Testing,Mocking,Jestjs,当前正在尝试测试以下功能: const readFileAsync = (file, use = false) => new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = () => { resolve(reader.result); }; reader.onerror = reject; if (use) r
const readFileAsync = (file, use = false) =>
new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
resolve(reader.result);
};
reader.onerror = reject;
if (use) reader.readAsDataURL(file);
else reader.readAsArrayBuffer(file);
});
export default readFileAsync;
但是在文件阅读器方面存在大量的问题。有什么建议吗?尽管我们模拟FileReader onload方法,但在执行readFileAsync方法后,reader.onload将分配给未模拟的匿名函数。因此,我们需要公开reader实例,在测试用例中获取reader实例,并手动执行reader.onload方法。然后,承诺将通过reader.result的模拟值来解决 例如。 index.ts: const readFileAsync=file,use=false=> 新承诺人解决方案,拒绝=>{ const reader=新文件读取器; reader.onload==>{ 结果; }; reader.onerror=拒绝; 如果使用reader.readAsDataURLfile; else reader.readasarraybuffer文件; readFileAsync,如有。_reader=reader; }; 导出默认readFileAsync; 根据readFileAsync作为任何读取器公开读取器实例 index.test.ts: 从“/”导入readFileAsync; const mFileReader=jest.fn=>{ 返回{ readAsDataURL:jest.fn, readAsArrayBuffer:jest.fn, }; }; 全局为any.FileReader=mFileReader; 描述'59581721',=>{ 之后=>{ 开玩笑; }; 毕竟=>{ 开玩笑,恢复活力; }; 它“应正确读取为数据url”,异步=>{ const blob=新blob['a']; const pending=readfileasynchblob,true; const mReader=readFileAsync,与任何阅读器一样; mReader.result='模拟结果'; mReader.onload; const actual=等待挂起; 预期的实际结果是“模拟结果”; expectmReader.readAsDataURL.toBeCalledWithblob; }; 它“应正确读取为数组缓冲区”,异步=>{ const blob=新blob['a']; const pending=readFileAsyncblob; const mReader=readFileAsync,与任何阅读器一样; mReader.result='模拟结果'; mReader.onload; const actual=等待挂起; 预期的实际结果是“模拟结果”; expectmReader.readAsArrayBuffer.toBeCalledWithblob; }; }; 单元测试结果和覆盖率报告: 通过src/stackoverflow/59581721/index.test.ts 13.673s 59581721 ✓ 应在21毫秒内正确读取为数据url ✓ 应正确读取为数组缓冲区2ms -----|-----|-----|-----|-----|----------| 文件|%Stmts |%Branch |%Funcs |%Lines |未覆盖的行| -----|-----|-----|-----|-----|----------| 所有文件| 100 | 100 | 100 | 100 || index.ts | 100 | 100 | 100 | 100 || -----|-----|-----|-----|-----|----------| 测试套件:1个通过,共1个 测试:2次通过,共2次 快照:共0个 时间:15.648秒 我的测试环境是node
源代码:您到底遇到了什么问题?什么类型的文件正在被传递到FileReader中,并且您正在测试套件中以dataURL或ArrayBuffer的形式读取?谢谢您的帮助,我非常感谢您的努力,但是我很难理解这里的TypeScript元素。readFileAsync的用途是什么;它做了什么在普通JS中做不到的事情?与any.FileReader=mFileReader相同,适用于全局文件;在测试文件中。@DanielCross我使用TypeScript,当然,它们可以使用普通JS来完成。xx作为任何一种表示它的类型断言。请参见readFileAsync的用途;正在公开读卡器实例,以便在执行readFileAsync方法并手动触发onload后获得读卡器实例。