我的 Nestjs 项目中使用 mocha 和 chai 时出现错误:TypeError [ERR_UNKNOWN_FILE_EXTENSION]:未知文件扩展名“.ts”

问题描述 投票:0回答:1

我只是使用以下命令简单创建项目: npm i -g @nestjs/cli

嵌套新项目名称 npm install --save-dev mocha chai @types/mocha @types/chai

package.json:

{
  "name": "project-name",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "private": true,
  "license": "UNLICENSED",
  "scripts": {
    "test": "mocha -r ts-node/register 'test/**/*.ts'",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "format": "prettier --write \"src/**/*.ts\""
  },
  "dependencies": {
    "@nestjs/common": "^10.0.0",
    "@nestjs/core": "^10.0.0",
    "@nestjs/platform-express": "^10.0.0",
    "reflect-metadata": "^0.2.0",
    "rxjs": "^7.8.1"
  },
  "devDependencies": {
    "@nestjs/cli": "^10.0.0",
    "@nestjs/schematics": "^10.0.0",
    "@tsconfig/node19": "^19.1.2",
    "@types/chai": "^4.3.12",
    "@types/express": "^4.17.17",
    "@types/mocha": "^10.0.6",
    "@types/node": "^20.3.1",
    "@types/supertest": "^6.0.0",
    "@typescript-eslint/eslint-plugin": "^6.0.0",
    "@typescript-eslint/parser": "^6.0.0",
    "chai": "^5.1.0",
    "cross-env": "^7.0.3",
    "eslint": "^8.42.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-plugin-prettier": "^5.0.0",
    "mocha": "^10.3.0",
    "nyc": "^15.1.0",
    "prettier": "^3.0.0",
    "source-map-support": "^0.5.21",
    "supertest": "^6.3.3",
    "ts-loader": "^9.4.3",
    "ts-node": "^10.9.2",
    "tsconfig-paths": "^4.2.0",
    "typescript": "^5.1.3"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  }
}

tsconfig.json:

{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "ES2021",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "skipLibCheck": true,
    "strictNullChecks": false,
    "noImplicitAny": false,
    "strictBindCallApply": false,
    "forceConsistentCasingInFileNames": false,
    "noFallthroughCasesInSwitch": false
  }
}

.mocharc.json

{
  "extension": [
    "ts"
  ],
  "spec": "test/**/*.ts",
  "require": [
    "ts-node/register",
    "source-map-support/register"
  ],
  "recursive": true
}

// src/calculator.service.ts

export class CalculatorService {
  add(a: number, b: number): number {
    return a + b;
  }
}

//测试/calculator.service.spec.ts

import { expect } from 'chai';
import { CalculatorService } from '../src/calculator.service';

describe('CalculatorService', () => {
  let calculatorService: CalculatorService;

  beforeEach(() => {
    calculatorService = new CalculatorService();
  });

  describe('add', () => {
    it('should return the sum of two numbers', () => {
      const result = calculatorService.add(2, 3);
      expect(result).to.equal(5);
    });
  });

  // Add more tests here for other methods of CalculatorService
});

当我运行 npm test 时

[电子邮件受保护] 测试 跨环境 TS_NODE_COMPILER_OPTIONS='{"module": "commonjs" }' mocha -r ts-node/register 'test/**/*.ts'

TypeError [ERR_UNKNOWN_FILE_EXTENSION]:/var/www/html/project-name/test/calculator.service.spec.ts 的未知文件扩展名“.ts” 在新的 NodeError (节点:内部/错误:399:5) 在 Object.getFileProtocolModuleFormat [作为文件:] (节点:internal/modules/esm/get_format:99:9) 在defaultGetFormat(节点:内部/模块/esm/get_format:139:38) 在 ESMLoader.defaultLoad (节点:内部/模块/esm/load:83:20) 在 ESMLoader.load(节点:内部/模块/esm/loader:342:43) 在 ESMLoader.moduleProvider (节点:内部/模块/esm/loader:207:22) 在新的 ModuleJob 处(节点:内部/模块/esm/module_job:63:26) 在 ESMLoader.#createModuleJob (节点:内部/模块/esm/loader:231:17) 在 ESMLoader.getModuleJob (节点:内部/模块/esm/loader:184:34)

typescript nestjs mocha.js chai
1个回答
0
投票

我遇到了同样的问题,经过整整 1 天的搜索和探索 mocha 和 chai 源代码,我发现:

Chai v5 使用 ESM 模块,这就是为什么它不会与 ts-node 一起编译,除非您使用 ts-node/esm 加载器,这是实验性功能

所以最好的解决方案是将chai降级到4.5.0版本

© www.soinside.com 2019 - 2024. All rights reserved.