NestJS Jest测试报错:ReferenceError: common_1 is not defined
NestJS Jest测试报错:ReferenceError: common_1 is not defined
问题背景
为NestJS服务搭建Jest测试环境时,运行jest命令后,服务与控制器测试均抛出ReferenceError: common_1 is not defined错误,推测该问题与@nestjs/common的导入相关,导入代码如下:
import { Injectable } from '@nestjs/common';
预期与实际结果
- 预期结果:测试正常运行无报错
- 实际结果:测试失败,错误信息如下:
FAIL src/regmol/regmol-oligos/regmol-oligos.service.spec.ts ● Test suite failed to run ReferenceError: common_1 is not defined 10 | 11 | > 12 | @Injectable() | ^ 13 | export class RegmolOligosService { 14 | 15 | at Object.<anonymous> (regmol/regmol-oligos/regmol-oligos.service.ts:12:2) at Object.<anonymous> (regmol/regmol-oligos/regmol-oligos.service.spec.ts:3:1) FAIL src/regmol/regmol-oligos/regmol-oligos.controller.spec.ts ● Test suite failed to run ReferenceError: common_1 is not defined 10 | 11 | > 12 | @Injectable() | ^ 13 | export class RegmolOligosService { 14 | 15 | at Object.<anonymous> (regmol/regmol-oligos/regmol-oligos.service.ts:12:2) at Object.<anonymous> (regmol/regmol-oligos/regmol-oligos.controller.spec.ts:3:1)
相关代码文件
regmol-oligos-controller.ts
import { Controller, Get, Param, Post, Body } from '@nestjs/common'; import { RegmolOligosService } from './regmol-oligos.service'; import { CheckHelmUniquenessDto } from '../dto/check-helm-uniqueness.dto'; import { BatchCheckHelmUniquenessDto } from '../dto/batch-check-helm-uniqueness.dto'; @Controller('regmol-oligos') export class RegmolOligosController { constructor(private regmolOligosService: RegmolOligosService) {} @Post('/helm/check-uniqueness') async checkHelmUniqueness(@Body() body: CheckHelmUniquenessDto): Promise<any> { const helm = body['helm']; return this.regmolOligosService.checkHelmUniqueness(helm); } @Post('/helm/batch-check-uniqueness') async batchCheckHelmUniqueness(@Body() body: BatchCheckHelmUniquenessDto): Promise<any> { return this.regmolOligosService.batchCheckHelmUniqueness(body); } }
regmol-oligos-controller.spec.ts
import { Test, TestingModule } from '@nestjs/testing'; import { RegmolOligosController } from './regmol-oligos.controller'; import { RegmolOligosService } from './regmol-oligos.service'; import { HttpModule } from '@nestjs/axios'; import { of } from 'rxjs'; describe('RegmolOligosController', () => { let regmolOligosController: RegmolOligosController; let regmolOligosService: RegmolOligosService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ imports: [HttpModule], controllers: [RegmolOligosController], providers: [RegmolOligosService] }).compile(); regmolOligosController = module.get<RegmolOligosController>(RegmolOligosController); regmolOligosService = module.get<RegmolOligosService>(RegmolOligosService); }); it('should be defined', () => { expect(regmolOligosController).toBeDefined(); }); it('should validate uniqueness of single helm string', async() => { // 仅测试控制器职责,mock服务的checkHelmUniqueness方法实现 const helm: string = "RNA1{[moe](G)[sp].[moe]([m5C])[sp].[moe]([m5C])[sp].[moe](T)[sp].[moe]([m5C])[sp].d(A)[sp].d(G)[sp].d(T)[sp].d([m5C])[sp].d(T)[sp].d(G)[sp].d([m5C])[sp].d(T)[sp].d(T)[sp].d([m5C])[sp].[moe](G)[sp].[moe]([m5C])[sp].[moe](A)[sp].[moe]([m5C])[sp].[moe]([m5C])}$$$$"; const result = { success: true, helm, unique: false, predecessorRegmolId: "IONIS-HELM200000183731" }; jest.spyOn(regmolOligosService, 'checkHelmUniqueness').mockImplementation(async () => result); expect(await regmolOligosController.checkHelmUniqueness({ helm })).toBe(result); }) });
regmol-oligos.service.ts
import { Injectable } from '@nestjs/common'; import { CheckHelmUniquenessDto } from '../dto/check-helm-uniqueness.dto'; // import * as FormData from 'form-data'; import FormData from 'form-data'; import { HttpService } from '@nestjs/axios'; import { map } from 'rxjs/operators'; import { forkJoin } from 'rxjs'; import { BatchCheckHelmUniquenessDto } from '../dto/batch-check-helm-uniqueness.dto'; import { Observable } from 'rxjs'; @Injectable() export class RegmolOligosService { constructor( private httpService: HttpService, ) {} structureCheckParentUrl = `${process.env.REGMOL_URL}/ajax.ashx?wrapper=json&cmd=structure.checkparent`; async checkHelmUniqueness(helm: string) { const form = new FormData(); form.append('sketch', helm); form.append('compoundType', 'oligonucleotide'); const headers = { ...form.getHeaders(), 'MolEngineApiKey': process.env.MOL_ENGINE_API_KEY }; let response$ = this.httpService.post(this.structureCheckParentUrl, form, { headers }) .pipe(map((response: any) => response.data)); let response = await response$.toPromise(); return response; } async batchCheckHelmUniqueness(body: BatchCheckHelmUniquenessDto) { const oligos = body['oligos']; const oligosData = {}; oligos.forEach(oligo => oligosData[oligo.oligoId] = this.checkHelmUniqueness(oligo.helm)) let response$ = forkJoin(oligosData).pipe(map(oligosData => { const response = {}; Object.entries(oligosData).forEach(([oligoId,v]: any) => { response[oligoId] = {}; response[oligoId].success = v.succeed; if (v.succeed) { let oligo = oligos.find(oligo => oligo.oligoId === +oligoId); response[oligoId].helm = oligo.helm; if (v['ret']['compoundid'] !== undefined) { response[oligoId].unique = v.ret.compoundid === "NEW"; response[oligoId].predecessorRegmolId = v.ret.compoundid; } } }) return response; })); return response$.toPromise(); } }
regmol-oligos.service.spec.ts
import { HttpModule } from '@nestjs/axios'; import { Test, TestingModule } from '@nestjs/testing'; import { RegmolOligosService } from './regmol-oligos.service'; describe('RegmolOligosService', () => { let service: RegmolOligosService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ imports: [HttpModule], providers: [RegmolOligosService], }).compile(); service = module.get<RegmolOligosService>(RegmolOligosService); }); it('should be defined', () => { expect(service).toBeDefined(); }); it('should validate uniqueness of single helm string', async() => { // 仅测试控制器职责,mock服务的checkHelmUniqueness方法实现 const helm: string = "RNA1{[moe](G)[sp].[moe]([m5C])[sp].[moe]([m5C])[sp].[moe](T)[sp].[moe]([m5C])[sp].d(A)[sp].d(G)[sp].d(T)[sp].d([m5C])[sp].d(T)[sp].d(G)[sp].d([m5C])[sp].d(T)[sp].d(T)[sp].d([m5C])[sp].[moe](G)[sp].[moe]([m5C])[sp].[moe](A)[sp].[moe]([m5C])[sp].[moe]([m5C])}$$$$"; const result = { success: true, helm, unique: false, predecessorRegmolId: "IONIS-HELM200000183731" }; expect(await service.checkHelmUniqueness(helm)).toBe(result); }) });
package.json
{ "name": "oligo-registration-service", "version": "0.0.1", "description": "", "author": "", "private": true, "license": "UNLICENSED", "scripts": { "prebuild": "rimraf dist", "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"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", "test": "jest", "test:watch": "jest --watch", "test:cov": "jest --coverage", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", "test:e2e": "jest --config ./test/jest-e2e.json", "test:regmol-oligos": "jest regmol-oligos" }, "dependencies": { "@nestjs/axios": "^0.0.7", "@nestjs/common": "^8.0.0", "@nestjs/config": "^1.1.6", "@nestjs/core": "^8.0.0", "@nestjs/mapped-types": "*", "@nestjs/passport": "^8.2.1", "@nestjs/platform-express": "^8.0.0", "@nestjs/terminus": "^8.0.6", "@nestjs/typeorm": "^8.0.3", "@types/date-and-time": "^0.13.0", "class-transformer": "^0.5.1", "class-validator": "^0.13.2", "dotenv": "^12.0.4", "express": "^4.17.2", "form-data": "^4.0.0", "joi": "^17.6.0", "knex": "^0.95.15", "lodash": "^4.17.21", "moment": "^2.29.4", "nestjs-knex": "^2.0.0", "oracledb": "^5.4.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.2.0", "swagger-ui-express": "^4.3.0", "typeorm": "^0.2.41" }, "devDependencies": { "@nestjs/cli": "^9.1.4", "@nestjs/schematics": "^8.0.0", "@nestjs/testing": "^8.0.0", "@types/express": "^4.17.13", "@types/jest": "27.4.1", "@types/lodash": "4.14.121", "@types/node": "^16.0.0", "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^5.0.0", "@typescript-eslint/parser": "^5.0.0", "eslint": "^8.0.1", "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^4.0.0", "jest": "^27.5.1", "prettier": "^2.3.2", "source-map-support": "^0.5.20", "supertest": "^6.1.3", "ts-jest": "^27.0.3", "ts-loader": "^9.2.3", "ts-node": "^10.7.0", "tsconfig-paths": "^3.10.1", "typescript": "^4.3.5" }, "jest": { "moduleFileExtensions": [ "js", "json", "ts" ], "rootDir": "src", "testRegex": ".*\\.spec\\.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "collectCoverageFrom": [ "**/*.(t|j)s" ], "coverageDirectory": "../coverage", "testEnvironment": "node" } }
排查方向
- 检查TypeScript编译配置:确保
tsconfig.json的module字段设置为commonjs,Jest在Node环境下依赖CommonJS模块格式。 - 清理依赖缓存:删除
node_modules和package-lock.json,重新执行npm install。 - 验证依赖版本兼容性:确认
ts-jest、jest、typescript版本匹配,当前配置中三者版本兼容,也可尝试更新到同大版本的最新版。 - 确认
reflect-metadata导入:在项目入口文件(如main.ts)中确保导入import 'reflect-metadata';,NestJS装饰器依赖该库。 - 检查测试环境变量:确认测试时
.env文件已正确加载,避免因环境变量未定义引发间接错误。
内容的提问来源于stack exchange,提问作者Pand0
相关产品推荐
相关产品推荐

