Angular单元测试报错:无法解析HttpRequest的所有参数
解决Angular单元测试中HttpRequest参数解析错误的问题
问题根源
你碰到的Error: Can't resolve all parameters for HttpRequest: (?, ?, ?, ?)错误,核心问题出在测试模块的providers里直接声明了HttpRequest作为依赖提供者——HttpRequest是Angular中需要特定参数才能实例化的类,根本不能直接这么注入到测试环境里。
另外看你的NoteService构造器依赖了HttpRequest,这其实不符合Angular的常规用法(一般我们都是注入HttpClient来发起请求),不过先聚焦测试的修复方案:
修复步骤
1. 移除providers中的HttpRequest
先把测试模块配置里providers数组中的HttpRequest项删掉,HttpClientTestingModule已经为测试环境提供了HttpClient的mock实现,完全不需要手动加这个类。
2. 重构MockNoteService,摆脱原服务的依赖链
你的MockNoteService继承自NoteService,而原服务依赖HttpRequest、AppConfig和Store,这就导致测试里还要处理这些额外依赖。不如直接写一个独立的mock类,只实现测试需要的方法就行:
@Injectable() export class MockNoteService { public static NON_EXISTING_ID = 'nonExistingId'; public getNoteDefinition(noteDefinitionVisibleId: string): Observable<NoteDefinition> { if (noteDefinitionVisibleId === MockNoteService.NON_EXISTING_ID) { return throwError('Test'); // 注意:observableThrowError已废弃,改用throwError } return of({ id: '', version: 0, name: '', description: '', attributeDefs: [], visibleId: '', userCreatable: false, instanceCopyable: false, definitionEditable: false, isSystem: false, bodyRequired: true }); } }
3. 更新测试模块的providers配置
调整后的测试模块配置应该是这样:
beforeEach(async(() => { TestBed.configureTestingModule({ imports: [HttpClientTestingModule], providers: [ AppConfig, CreateSpAuthorizationUtility, {provide: DialogService, useClass: MockDialogService}, {provide: NoteService, useClass: MockNoteService}, {provide: Router, useClass: MockRouter}, {provide: StepperService, useClass: StepperServiceMock}, {provide: Store, useClass: TestStore} ] }); }));
4. 精简测试函数的冗余参数
你的测试函数里注入了一堆没用到的依赖(比如router、store这些),完全可以删掉,让代码更简洁:
it('should build query params', inject([CreateSpAuthorizationUtility], fakeAsync( (service: CreateSpAuthorizationUtility) => { const prescreen: SpPrescreenSelectedValues = SP_PRESCREEN_SELECTED_VALUES_MOCK; service.buildQueryParams(prescreen, false); // 这里可以补充断言,验证生成的query params是否符合预期 } )));
额外建议
- 检查下
NoteService里的HttpRequest是不是笔误?Angular里发起HTTP请求标准做法是用HttpClient,如果是写错了,替换成HttpClient后,测试环境里HttpClientTestingModule会自动提供mock,维护起来更省心。 - 除非需要复用原服务的大部分逻辑,否则尽量别让mock类继承原服务,独立的mock类更灵活,能避免很多依赖链带来的麻烦。
内容的提问来源于stack exchange,提问作者Thom
相关产品推荐
相关产品推荐

