我只是使用以下命令简单创建项目: 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)
我遇到了同样的问题,经过整整 1 天的搜索和探索 mocha 和 chai 源代码,我发现:
Chai v5 使用 ESM 模块,这就是为什么它不会与 ts-node 一起编译,除非您使用 ts-node/esm 加载器,这是实验性功能
所以最好的解决方案是将chai降级到4.5.0版本