You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows环境下Node.js TS项目Mocha测试配置报错求助

Node.js + Mocha测试配置故障排查(Windows + pnpm)

环境信息

  • Node.js 18.14.0
  • pnpm 8.14.0
  • Windows 操作系统
  • 背景:Python转Node.js开发,正在构建REST API,配置Mocha自动化测试

问题1:使用swc-node加载器执行测试失败

package.json中的test命令

"test": "cross-env SWCRC=true NODE_OPTIONS='--loader @swc-node/register/esm' mocha ./src/tests/**/*.test.ts"

执行pnpm test后的错误日志

> cross-env SWCRC=true NODE_OPTIONS='--loader @swc-node/register/esm' mocha ./src/tests/**/*.test.ts

The system cannot find the path specified.
node:events:491
      throw er; // Unhandled 'error' event
      ^

Error: spawn @swc-node\register\esm ENOENT
    at notFoundError (PATH_TO_FOLDER\Nodejs_tutorials\node_modules\.pnpm\cross-spawn@7.0.3\node_modules\cross-spawn\lib\enoent.js:6:26)
    at verifyENOENT (PATH_TO_FOLDER\Nodejs_tutorials\node_modules\.pnpm\cross-spawn@7.0.3\node_modules\cross-spawn\lib\enoent.js:40:16)
    at cp.emit (PATH_TO_FOLDER\Nodejs_tutorials\node_modules\.pnpm\cross-spawn@7.0.3\node_modules\cross-spawn\lib\enoent.js:27:25)
    at ChildProcess._handle.onexit (node:internal/child_process:291:12)
Emitted 'error' event on ChildProcess instance at:
    at cp.emit (PATH_TO_FOLDER\Nodejs_tutorials\node_modules\.pnpm\cross-spawn@7.0.3\node_modules\cross-spawn\lib\enoent.js:30:37)
    at ChildProcess._handle.onexit (node:internal/child_process:291:12) {
  code: 'ENOENT',
  errno: 'ENOENT',
  syscall: 'spawn @swc-node\\register\\esm',
  path: '@swc-node\\register\\esm',
  spawnargs: [ 'mocha', './src/tests/**/*.test.ts' ]        
}

Node.js v18.14.0
 ELIFECYCLE  Test failed. See above for more details.

问题2:改用ts-node加载器执行测试失败

执行命令

pnpm mocha --loader ts-node/esm .\src\tests\handlers\user.handler.test.ts

错误日志

PS PATH_TO_FOLDER\Nodejs_tutorials> pnpm mocha --loader ts-node/esm .\src\tests\handlers\user.handler.test.ts
(node:9336) ExperimentalWarning: Custom ESM Loaders is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
node:internal/errors:490
    ErrorCaptureStackTrace(err);
    ^

Error [ERR_UNSUPPORTED_ESM_URL_SCHEME]: Only URLs with a scheme in: file and data are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'c:'
    at new NodeError (node:internal/errors:399:5)
    at throwIfUnsupportedURLScheme (node:internal/modules/esm/resolve:1059:11)
    at defaultResolve (node:internal/modules/esm/resolve:1135:3)
    at nextResolve (node:internal/modules/esm/loader:163:28)
    at ESMLoader.resolve (node:internal/modules/esm/loader:838:30)
    at ESMLoader.getModuleJob (node:internal/modules/esm/loader:424:18)
    at ESMLoader.import (node:internal/modules/esm/loader:525:22)
    at initializeLoader (node:internal/process/esm_loader:75:58)
    at loadESM (node:internal/process/esm_loader:90:11)
    at runMainESM (node:internal/modules/run_main:55:21) {  
  code: 'ERR_UNSUPPORTED_ESM_URL_SCHEME'
}

Node.js v18.14.0

附:配置文件

(以下为示例框架,请补充实际配置内容)

package.json 示例片段

{
  "type": "module",
  "scripts": {
    "test": "..."
  },
  "devDependencies": {
    "mocha": "^10.2.0",
    "@swc-node/register": "^1.6.8",
    "cross-env": "^7.0.3",
    "ts-node": "^10.9.1",
    "typescript": "^5.3.3"
  }
}

tsconfig.json 示例片段

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "moduleResolution": "NodeNext",
    "esModuleInterop": true,
    "skipLibCheck": true,
    "strict": true,
    "outDir": "./dist"
  },
  "include": ["src/**/*"]
}

解决思路

针对问题1(swc-node ENOENT错误)

  • 修正Windows引号语法:Windows cmd不支持单引号包裹环境变量值,将NODE_OPTIONS的单引号改为转义双引号,修改test命令为:
    "test": "cross-env SWCRC=true NODE_OPTIONS=\"--loader @swc-node/register/esm\" mocha ./src/tests/**/*.test.ts"
    
  • 确认依赖完整性:执行pnpm add -D @swc-node/register @swc/core,确保swc相关依赖正确安装
  • 清理pnpm缓存:执行pnpm store prune清除缓存,再运行pnpm install重新安装所有依赖,避免缓存导致的依赖缺失

针对问题2(ts-node URL Scheme错误)

  • 统一路径分隔符:Windows下使用正斜杠替代反斜杠,修改测试命令为:
    pnpm mocha --loader ts-node/esm ./src/tests/handlers/user.handler.test.ts
    
  • 配置ESM支持:确保package.json中设置"type": "module",tsconfig.json中设置"module": "ESNext"和"moduleResolution": "NodeNext",统一TypeScript和Node.js的模块规范
  • 添加ts-node配置:创建ts-node.config.json或在tsconfig.json中添加ESM支持:
    {
      "esm": true,
      "experimentalSpecifierResolution": "node"
    }
    

内容的提问来源于stack exchange,提问作者Compphys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:45:06