如何使用Jest匹配器验证含动态文件名的函数调用参数
解决Jest中匹配含动态日期的调用参数问题
方案一:用嵌套匹配器直接验证
Jest的toHaveBeenCalledWith支持搭配各种匹配器,不用硬匹配整个对象。针对你的场景,嵌套使用expect.objectContaining、expect.arrayContaining和expect.stringContaining就能精准检查文件名前缀,完全不用管后面的动态日期:
// 调用process函数后执行验证 expect(process).toHaveBeenCalledWith( expect.objectContaining({ documents: expect.arrayContaining([ expect.objectContaining({ filename: expect.stringContaining('doc1'), content: 'text1' }), expect.objectContaining({ filename: expect.stringContaining('doc2'), content: 'text2' }) ]) }) );
expect.stringContaining('doc1'):只校验文件名包含doc1前缀,忽略后续日期部分expect.arrayContaining:确保documents数组里存在符合条件的元素expect.objectContaining:只要对象包含指定属性即可,无需完全匹配整个结构
方案二:提取调用参数后手动校验
如果觉得嵌套匹配器看着繁琐,也可以直接取出process的调用记录,自己遍历做校验:
// 获取process的所有调用参数 const processCalls = process.mock.calls; // 遍历每一次调用的参数 processCalls.forEach(args => { const hasDoc1 = args[0].documents.some(doc => doc.filename.includes('doc1') && doc.content === 'text1' ); const hasDoc2 = args[0].documents.some(doc => doc.filename.includes('doc2') && doc.content === 'text2' ); expect(hasDoc1 && hasDoc2).toBe(true); });
这种方式灵活性更高,适合需要添加额外自定义校验逻辑的场景。
内容的提问来源于stack exchange,提问作者BreenDeen
相关产品推荐
相关产品推荐

