使用Next.js动态路由时,Jest无法找到路径含括号的测试文件
解决Next.js动态路由路径下Jest无法识别测试文件的问题
问题出在Jest的glob匹配规则上:路径里的[和]是glob的特殊通配符(用来匹配字符集),所以pages/projects/[group]/[project]/MyTest.test.tsx里的括号会被Jest当成匹配规则,而不是路径的一部分,导致匹配失败。
下面是几个可行的解决办法:
转义glob里的括号
在jest.config.js的testMatch中,用双重反斜杠转义括号(因为JS字符串需要先转义反斜杠),同时保留原有匹配规则覆盖其他测试文件:module.exports = { testMatch: [ '**/\\[*\\]/?(*.)+(test).ts?(x)', '**/?(*.)+(test).ts?(x)' ], // 其他配置... };这里
\\[*\\]会匹配任意带括号的目录,比如[group]、[project],确保这类目录下的测试文件能被扫描到。改用testRegex正则匹配
相比glob,正则表达式可以更精准处理字面量括号,替换testMatch为testRegex:module.exports = { testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$', testPathIgnorePatterns: ['/node_modules/'], // 其他配置... };这个正则会直接匹配文件名里的
test或spec后缀,不管目录结构里的特殊字符。调整测试文件位置
如果项目允许,把测试文件移到pages目录外的__tests__文件夹,比如__tests__/projects/[group]/[project]/MyTest.test.tsx,然后在jest.config.js里添加对应匹配规则:module.exports = { testMatch: ['**/__tests__/**/*.(test|spec).ts?(x)'], // 其他配置... };这种方式避开了pages目录下动态路由的括号路径问题,也是Next.js项目常用的测试文件组织方式。
验证配置是否生效可以运行:
npx jest --debug
查看输出里的testMatch/testRegex配置,以及Candidate modules部分,确认目标测试文件是否被Jest识别。
内容的提问来源于stack exchange,提问作者ABrown
相关产品推荐
相关产品推荐

