我在Angular 11中测试组件时遇到了一个错误,我不知道为什么。
This constructor is not compatible with Angular Dependency Injection because its dependency at index 0 of the parameter list is invalid.
This can happen if the dependency type is a primitive like a string or if an ancestor of this class is missing an Angular decorator.
at ɵɵinvalidFactoryDep (../../node_modules/@angular/core/bundles/core.umd.js:5098:15)
at NodeInjectorFactory.factory (....ng:LoginComponentɵfac.js:5:42)
at getNodeInjectable (../../node_modules/@angular/core/bundles/core.umd.js:3872:48)
LoginComponent构造函数是:
constructor(
public loginSvc: LoginService,
public iamService: IamService,
private activatedRoute: ActivatedRoute,
private growlService: GrowlerService,
private matDialog: MatDialog,
public dialogForm: MatDialog,
@Inject(ENVIRONMENT) private environment: Environment
) {
}
这使得索引0登录服务,我在测试台中对此进行了嘲笑
TestBed.configureTestingModule({
imports: [
FormsModule,
RouterTestingModule.withRoutes([]),
MatDialogModule
],
declarations: [LoginComponent, CallbackComponent],
providers: [
{
provide: LoginService, useFactory: () => {
return {} as LoginService;
}
}
]
}).compileComponents();
我的笑话.config:
module.exports = {
displayName: 'authorization',
preset: '../../jest.preset.js',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
globals: {
'ts-jest': {
tsconfig: '<rootDir>/tsconfig.spec.json',
stringifyContentPathRegex: '\.(html|svg)$',
astTransformers: {
before: [
'jest-preset-angular/build/InlineFilesTransformer',
'jest-preset-angular/build/StripStylesTransformer'
]
}
}
},
coverageDirectory: '../../coverage/libs/authorization',
snapshotSerializers: [
'jest-preset-angular/build/serializers/no-ng-attributes',
'jest-preset-angular/build/serializers/ng-snapshot',
'jest-preset-angular/build/serializers/html-comment'
],
transform: {
'^.+\.(ts|html)$': 'ts-jest',
'^.+\.js$': 'babel-jest'
},
transformIgnorePatterns: [
'../../node_modules/(?!hashjs-es')'
]
};
感谢提供的任何帮助
我的猜测是
@Inject(ENVIRONMENT) private environment: Environment
应该是
@Inject("ENVIRONMENT") private environment: Environment
或
@Inject(Environment) private environment: Environment
您的模块中是否提供了环境?也许你也需要在TestBed中提供它:
{ provide: ENVIRONMENT, useValue: environment }