Node内置测试Runner仅识别第一层级测试文件且ESLint未检测到测试文件规则违规问题排查
看起来你遇到的两个问题根源都是Unix shell对**通配符的处理行为,我来逐个拆解并给出解决方案:
问题1:ESLint未触发预期的规则违规
你的lint脚本写的是npx eslint ./**/*.ts,但在Pop!_OS默认的bash环境中,**通配符需要开启globstar选项才会递归匹配所有子目录(bash 4+支持,但默认可能没启用)。如果没开globstar,./**/*.ts只会匹配当前目录和直接子目录下的.ts文件——也就是lib/index.ts(空文件,无违规),而test目录下的深层文件根本没被传递给ESLint,自然看不到报错。
当你删除lib文件夹后,shell找不到符合./**/*.ts的直接子目录文件,就会把通配符原封不动传给ESLint,此时ESLint自己处理递归匹配,就能检测到test里的文件了。
修复方案
把通配符用引号包裹,让ESLint自己处理递归匹配(推荐这种方式,不依赖shell配置):
"scripts": { "lint": "npx eslint \"./**/*.ts\"" }
另外,你的ESLint配置继承了es/browser(浏览器环境),但测试文件用了Node.js的node:test模块,会触发no-undef规则。建议在.eslintrc.json中添加Node环境支持:
{ "extends": "es/browser", "env": { "node": true, "es2020": true } }
问题2:Node测试Runner仅识别第一层级的测试文件
和ESLint的问题完全一样——shell没正确展开./test/**/*Tests.ts的递归通配符,导致只有test/aFolder/pickedUpTests.ts被传给测试Runner,深层的ignoredTests.ts被漏掉了。
修复方案
同样用引号包裹通配符,让Node测试Runner自己处理路径匹配:
"scripts": { "test": "node --test --require ts-node/register \"./test/**/*Tests.ts\"" }
如果想确保ts-node使用正确的TypeScript配置,可以加上--project参数:
"scripts": { "test": "node --test --require ts-node/register --project tsconfig.json \"./test/**/*Tests.ts\"" }
额外说明:关于shell的globstar
如果你更习惯依赖shell的通配符展开,可以在脚本中先启用globstar:
"scripts": { "lint": "shopt -s globstar && npx eslint ./**/*.ts", "test": "shopt -s globstar && node --test --require ts-node/register ./test/**/*Tests.ts" }
不过这种方式依赖bash环境,跨平台性不如让工具自己处理通配符。
内容的提问来源于stack exchange,提问作者user19025657

