【问题标题】:Error: Can't resolve all parameters for HttpRequest错误:无法解析 HttpRequest 的所有参数
【发布时间】:2019-01-31 23:44:27
【问题描述】:

发现了几个类似的错误,但我认为它们不适用。他们谈论组件的顺序,我想我已经尝试了一切。

我正在为现有服务编写新的单元测试。这是服务构造函数:

@Injectable()
export class CreateSpAuthorizationUtility {
    constructor(
        private dialogService: DialogService,
        private router: Router,
        private store: Store<AppStore>,
        private noteService: NoteService,
        private stepperService: StepperService
    ) {
    }
}

这是我写的单元测试:

describe('Given a CreateSpAuthorizationUtility', () => {

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [
            ],
            imports: [
                HttpClientTestingModule
            ],
            providers: [
                AppConfig,
                HttpRequest,
                CreateSpAuthorizationUtility,
                {provide: DialogService, useClass: MockDialogService},
                {provide: NoteService, useClass: MockNoteService},
                {provide: Router, useClass: MockRouter},
                {provide: StepperService, useClass: StepperServiceMock},
                {provide: Store, useClass: TestStore}
            ]
        });
    }));

    it('should build query params',
        inject([CreateSpAuthorizationUtility, HttpTestingController, AppConfig],
            fakeAsync( (service: CreateSpAuthorizationUtility,
                        mockBackend: HttpTestingController,
                        appConfig: AppConfig,
                        router: MockRouter,
                        store: TestStore<AppStore>,
                        dialogService: MockDialogService,
                        noteService: MockNoteService,
                        stepperService: StepperServiceMock)  => {

                const prescreen: SpPrescreenSelectedValues = SP_PRESCREEN_SELECTED_VALUES_MOCK;
                service.buildQueryParams(prescreen, false);
            })));
});

这里是 MockNoteService:

@Injectable()
export class MockNoteService extends NoteService {
    public static NON_EXISTING_ID = 'nonExistingId';

    public getNoteDefinition(noteDefinitionVisibleId: string): Observable<NoteDefinition> {
        if (noteDefinitionVisibleId === MockNoteService.NON_EXISTING_ID) {
            return observableThrowError('Test');
        }

        return of({
            id: '',
            version: 0,
            name: '',
            description: '',
            attributeDefs: [],
            visibleId: '',
            userCreatable: false,
            instanceCopyable: false,
            definitionEditable: false,
            isSystem: false,
            bodyRequired: true
        });
    }
}

扩展了 NoteService:

export class NoteService extends BaseService {
    constructor(private http: HttpRequest, private appConfig: AppConfig, private store: Store<AppStore>) {
        super();
    }
}

当我运行它时,我收到以下错误:

Error: Can't resolve all parameters for HttpRequest: (?, ?, ?, ?).
    at syntaxError (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:1021:1)
    at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver._getDependenciesMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:10922:1)
    at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver._getTypeMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:10815:1)
    at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver._getInjectableTypeMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:11037:1)
    at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver.getProviderMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:11046:1)
    at http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:10984:1
    at Array.forEach (<anonymous>)
    at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver._getProvidersMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:10944:1)
    at CompileMetadataResolver.push../node_modules/@angular/compiler/fesm5/compiler.js.CompileMetadataResolver.getNgModuleMetadata (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:10663:53)
    at JitCompiler.push../node_modules/@angular/compiler/fesm5/compiler.js.JitCompiler._loadModules (http://localhost:9876/node_modules/@angular/compiler/fesm5/compiler.js?:23876:1)

正如我所说,我已经尝试对项目中的其他单元测试进行排序和比较。我不确定下一步该怎么做。

【问题讨论】:

  • 我没有看到导入,但我假设您使用原始的 HttpRequest 类及其实现,并且 测试模块 有问题,因为它无法解析正在尝试的参数注入。
  • @Buczkowski,我查看了 HttpRequest,它需要 HttpHeaders 和 HttpParams,但我正在编码的测试不会导入这些。我尝试将它们放在 TestBed 设置的导入部分中,但它只是混淆了它。
  • 完全删除它,您已经为您在构造函数中注入的依赖项提供了 Mocks。
  • @Buczkowski 这让我明白了:错误:StaticInjectorError(DynamicTestModule)[NoteService -> HttpRequest]: StaticInjectorError(Platform: core)[NoteService -> HttpRequest]: NullInjectorError: No provider for HttpRequest!
  • 这意味着NoteServiceHttpRequest 作为依赖项,或者至少这是我的想法,但是由于您为其提供了Mock,因此它的意义不大...您能证明MockNoteService 吗?

标签: angular typescript jasmine karma-jasmine


【解决方案1】:

所以,最后,我让 MockNoteService 没有从 NoteService 扩展,这样我就没有继承链,这似乎解决了问题。

感谢 Buczkowski 的帮助。

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2017-07-30
    相关资源
    最近更新 更多