ts-jest Nestjs 无法读取枚举未定义的属性

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

我正在使用

NestJS
创建应用程序,并使用
ts-jest
进行 e2e 测试。 这是我的代码存储库: https://github.com/redplane/jest-issue

我有一个具有以下逻辑的控制器:

@Controller({
  path: 'api/shape',
  scope: Scope.REQUEST,
})
export class ShapeController {
  public constructor(
    @Inject(AppInjectors.SERVICE__JOI)
    private readonly __joiService: IJoiService
  ) {}

  @Get()
  public async processAsync(@Query() query: ProcessShapeQuery): Promise<void> {
    // Do the parameter validation
    console.log(ShapeDimensions);
    await this.__joiService.validateAsync(query, processImageQueryJoiSchema);
  }
}

如果我使用邮递员请求此 api,一切正常并且控制台打印:

{ WIDTH: 'WIDTH', HEIGHT: 'HEIGHT' }

但是,当我尝试使用此命令进行 e2e 测试时:

npm run e2e:api

我收到此错误:

TypeError: Cannot read properties of undefined (reading 'PIXEL')
       5 | export const imageFrameOptionsJoiSchema =  Joi.object<ShapeFrameOptions>({
       6 |   size: Joi.number().min(1),
    >  7 |   unit: Joi.any().valid(ShapeUnits.PIXEL),
         |                                    ^
       8 |   dimension: Joi.any().valid(ShapeDimensions.HEIGHT, ShapeDimensions.WIDTH)
       9 | });
      10 |
      at Object.<anonymous> (../api/src/app/validators/image-frame-options.joi-schema.ts:7:36)
      at Object.<anonymous> (../api/src/app/validators/process-image-options.joi-schema.ts:3:1)
      at Object.<anonymous> (../api/src/app/validators/process-image-query.joi-schema.ts:2:1)
      at Object.<anonymous> (../api/src/app/modules/apis/shape/shape.controller.ts:3:1)
      at Object.<anonymous> (../api/src/app/modules/apis/shape/shape.module.ts:2:1)
      at Object.<anonymous> (../api/src/app/modules/apis/shape/index.ts:1:1)
      at Object.<anonymous> (../api/src/app/modules/apis/index.ts:1:1)
      at Object.<anonymous> (../api/src/app/modules/index.ts:1:1)
      at Object.<anonymous> (../api/src/app/index.ts:5:1)
      at Object.<anonymous> (../api/src/index.ts:1:1)
      at Object.<anonymous> (src/modules/test-app.module.ts:2:1)
      at Object.<anonymous> (src/api/image/api-e2e.spec.ts:5:1)

如果我注释掉:

await this.__joiService.validateAsync(query, processImageQueryJoiSchema);

console.log(ShapeDimensions);
的值未定义,但是,如果我打印
api
项目的枚举,它仍然会正常打印。

这是我的

jest.config.ts
:

/* eslint-disable */
export default {
  displayName: 'api-e2e',
  preset: '../../jest.preset.js',
  globalSetup: '<rootDir>/src/support/global-setup.ts',
  globalTeardown: '<rootDir>/src/support/global-teardown.ts',
  setupFiles: ['<rootDir>/src/support/test-setup.ts'],
  testEnvironment: 'node',
  transform: {
    '^.+\\.[tj]s$': [
      'ts-jest',
      {
        tsconfig: '<rootDir>/tsconfig.spec.json',
      },
    ],
  },
  moduleNameMapper: {
    "@image-service/api": "<rootDir>/../api/src/index.ts",
    "@image-service/api-business": "<rootDir>/../../libs/api-business/src"
  },
  moduleFileExtensions: ['ts', 'js', 'html'],
  coverageDirectory: '../../coverage/api-e2e',
};

我已尝试遵循以下提到的解决方案:

-> 我检查了循环依赖,但什么也没发现

请问有什么解决办法吗?

谢谢,

typescript jestjs nestjs e2e-testing ts-jest
1个回答
0
投票

放松心情几个小时后,突然我找到了解决方案:

jest.config.ts
中,我有这部分:

moduleNameMapper: {
    "@image-service/api": "<rootDir>/../api/src/index.ts",
    "@image-service/api-business": "<rootDir>/../../libs/api-business/src"
  },

以前,当我使用旧版本的

NestJS
jest
时,我必须使用它来使我的测试文件识别我的库项目。

使用当前版本的

NestJS
jest
(主要是关于
jest
),删除此配置后,我的测试运行成功。

所以新的

jest.config.ts
是:

/* eslint-disable */
export default {
  displayName: 'api-e2e',
  preset: '../../jest.preset.js',
  globalSetup: '<rootDir>/src/support/global-setup.ts',
  globalTeardown: '<rootDir>/src/support/global-teardown.ts',
  setupFiles: ['<rootDir>/src/support/test-setup.ts'],
  testEnvironment: 'node',
  transform: {
    '^.+\\.[tj]s$': [
      'ts-jest',
      {
        tsconfig: '<rootDir>/tsconfig.spec.json',
      },
    ],
  },
  moduleFileExtensions: ['ts', 'js', 'html'],
  coverageDirectory: '../../coverage/api-e2e',
};

所以结果是: enter image description here

希望这对遇到同样令人沮丧问题的人有所帮助。

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