我正在使用
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',
};
我已尝试遵循以下提到的解决方案:
-> 我检查了循环依赖,但什么也没发现
请问有什么解决办法吗?
谢谢,
放松心情几个小时后,突然我找到了解决方案:
在
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',
};
希望这对遇到同样令人沮丧问题的人有所帮助。