fs.existsSync无法匹配通配符文件名,应使用什么方法替代?
问题根因
fs.existsSync 本身不支持通配符语法,你传入的*会被当成文件名的固定字符去查找,自然找不到符合规则的文件,导致测试运行失败。
解决方案
有两种常用的实现方式:
方案1:使用Node.js原生API实现(无需额外依赖)
先读取目标目录下的所有文件,再通过正则匹配筛选符合规则的文件,示例代码如下:
const fs = require('fs'); const path = require('path'); // 封装通配符文件匹配函数 function matchFiles(dir, pattern) { const allFiles = fs.readdirSync(dir); // 将通配符规则转换为正则 const regex = new RegExp(`^${pattern.replace(/\*/g, '.*')}$`); return allFiles.filter(file => regex.test(file)); } // 改造后的测试用例 describe('Sitemap', () => { it('it should create XML sitemap', () => { let language='hindi' return sitemapContainer.createSitemap(language).then(() => { const matchedFiles = matchFiles('sos', `sos_${language}*.xml`); // 可根据需求调整判断条件,比如判断长度是否为3 expect(matchedFiles.length).to.be.greaterThan(0); }); }) })
方案2:使用第三方glob包(写法更简洁,支持复杂通配符规则)
glob是专门用于文件路径匹配的工具,完全兼容shell通配符语法:
- 先安装依赖:
npm install glob --save-dev - 改造后的测试用例:
const glob = require('glob'); describe('Sitemap', () => { it('it should create XML sitemap', () => { let language='hindi' return sitemapContainer.createSitemap(language).then(() => { // 直接传入带通配符的路径即可返回所有匹配的文件数组 const matchedFiles = glob.sync(`sos/sos_${language}*.xml`); expect(matchedFiles.length).to.be.greaterThan(0); // 如果要验证正好生成3个匹配文件,可改为: // expect(matchedFiles.length).to.equal(3); }); }) })
注意事项
如果你的测试场景需要严格校验生成文件的数量,直接判断匹配结果的数组长度即可,比单纯校验文件是否存在更严谨。
内容的提问来源于stack exchange,提问作者Harsh Sarohi
相关产品推荐
相关产品推荐

