La prueba Jest ha fallado con el error “El constructor de la clase Stack no puede ser invocado sin ‘new'”.
Obtuve esta prueba de jest para una configuración aws-cdk:
import { expect as expectCDK, matchTemplate, MatchStyle } from '@aws-cdk/assert';
import * as cdk from '@aws-cdk/core';
import { KmsMultiregionPrincipalKey } from '../lib/kms<em>multiregion</em>principalkey-stack';
test('Not Empty Stack', () => {
const app = new cdk.App();
// WHEN
const stack = new KmsMultiregionPrincipalKey(app, 'MyTest_KmsMultiRegionKeyStack');
// THEN
// expectCDK(stack).to(matchTemplate({
// "Resources": {}
// }, MatchStyle.EXACT))
});
La clase KmsMultiregionPrincipalKey se declara de la siguiente manera:
export class KmsMultiregionPrincipalKey extends cdk.Stack {
public readonly principalKeyArn: string;
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// REST OF THE CLASS CODE HERE
}
}
Para obtener más detalles, a continuación se muestran los archivos tsconfig.json y jest.config.json:
tsconfig.json
{
"compilerOptions": {
"target": "ES2018",
"module": "commonjs",
"lib": [
"es2018"
],
"declaration": true,
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"noImplicitThis": true,
"alwaysStrict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": false,
"inlineSourceMap": true,
"inlineSources": true,
"experimentalDecorators": true,
"strictPropertyInitialization": false,
"typeRoots": [
"./node_modules/@types"
]
},
"exclude": [
"node_modules",
"cdk.out"
]
}
jest.config.json
module.exports = {
testEnvironment: 'node',
roots: ['<rootdir>/test'],
testMatch: ['**/*.test.ts'],
transform: {
'^.+\\.tsx?$': 'ts-jest'
}
};
Cuando ejecuto la prueba, obtengo el siguiente error:
Class constructor Stack cannot be invoked without 'new'
Pregunta: ¿Qué está mal con mi prueba o las configuraciones jest/typescript?
Para darle más contexto, esta prueba pasa cuando todo, excepto la definición de la aplicación, está comentado:
“`
import { expect as expectCDK, matchTemplate, MatchStyle } from '@aws-cdk/assert';
import * as cdk from '@aws-cdk/core';
import { KmsMultiregionPrincipalKey } from '../lib/kms<em>multiregion</em>principalkey-stack';
test('Not Empty Stack', () => {
const app = new cdk.App();
// WHEN
//const stack = new KmsMultiregionPrincipalKey(app, 'MyTest_KmsMultiRegionKeyStack');
// THEN
// expectCDK(stack).to(matchTemplate({
// "Resources": {}
// }, MatchStyle.EXACT))
});
“`
davy.ai
El problema con la prueba es que no está usando la palabra clave
new
para crear una instancia de la claseKmsMultiregionPrincipalKey
. La claseKmsMultiregionPrincipalKey
extiendecdk.Stack
, que es un constructor de clase que requiere la palabra clavenew
para crear una instancia.Para solucionar el error, cambia la línea que crea una nueva instancia de
KmsMultiregionPrincipalKey
para usar la palabra clavenew
:const stack = new KmsMultiregionPrincipalKey(app, 'MyTest_KmsMultiRegionKeyStack');
Además, asegúrate de haber importado el módulo
cdk
en el archivo de prueba:import * as cdk from '@aws-cdk/core';
Además, asegúrate de que el paquete
cdk
esté instalado en tu proyecto:npm install @aws-cdk/core
Aparte de esto, la configuración de Jest/Typescript se ve bien.