Angular+Jasmine/Karma报错:无法加载LrCategoriesComponent指令摘要求助
我一直在尝试解决这个测试报错,但目前网上的方案都没有帮助。运行测试时出现以下错误:
ERROR: ERROR: 'Unhandled Promise rejection:', 'Illegal state: Could not load the summary for directive LrCategoriesComponent.'
以下是lr-categories.component.spec.ts的代码:
export function main() { describe('LrCategoriesComponent', () => { let fixture: ComponentFixture<LrCategoriesComponent>; let component: LrCategoriesComponent; let de: DebugElement; let glService: GeneralLedgeService; let lrService: LrService; let spy: jasmine.Spy; beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ LrComponent, LrMappingsComponent, LrCategoriesComponent, ], imports: [ CommonModule, SharedModule, LrRoutingModule, AgGridModule.withComponents( [ ButtonComponent, ColumnHeaderComponent, TypeaheadEditorComponent, ButtonGroupComponent ] ) ], providers: [ LrService, { provide: GeneralLedgeService, useClass: MockGeneralLedgeService }, CompleterService, ] }).compileComponents().then(() => { // initialization fixture = TestBed.createComponent(LrCategoriesComponent); component = fixture.componentInstance; de = fixture.debugElement; // Service getters glService = de.injector.get(GeneralLedgeService); lrService = de.injector.get(LrService); }); })); // beforeEach(() => { // // initialization // fixture = TestBed.createComponent(LrCategoriesComponent); // component = fixture.componentInstance; // de = fixture.debugElement; // // // Service getters // glService = de.injector.get(GeneralLedgeService); // lrService = de.injector.get(LrService); // }); it('should create LrCategoriesComponent', (() => { expect(component).toBeDefined(); })); }); }
我之前也碰到过类似的Angular测试异常,给你几个实际可行的排查和解决方向:
核查组件依赖与声明完整性:虽然你已经把
LrCategoriesComponent加入了测试模块的declarations,但可以再确认组件文件路径是否正确、类名有没有拼写错误。另外,检查SharedModule是否导出了该组件用到的所有指令、管道或子组件——如果有依赖未被正确导出或声明,就可能触发这个报错。调整组件初始化的时序逻辑:你现在把组件初始化放在了
compileComponents().then()回调里,有时候异步加载的时序会出现问题。可以尝试把初始化逻辑拆分到单独的beforeEach块,确保TestBed完全配置完成后再初始化组件:beforeEach(async(() => { TestBed.configureTestingModule({ // 保留你的原有配置内容 }).compileComponents(); })); beforeEach(() => { fixture = TestBed.createComponent(LrCategoriesComponent); component = fixture.componentInstance; de = fixture.debugElement; glService = de.injector.get(GeneralLedgeService); lrService = de.injector.get(LrService); });移除或替换测试中的路由模块:测试模块里导入了
LrRoutingModule,正式环境的路由模块可能包含延迟加载或复杂配置,在测试环境下容易引发异常。可以尝试注释掉LrRoutingModule,换成RouterTestingModule来模拟路由环境,看看报错是否消失。验证Mock服务的正确性:检查
MockGeneralLedgeService是否完整实现了GeneralLedgeService的所有方法和属性。如果Mock服务有缺失或实现错误,组件初始化时可能抛出异常,间接触发这个报错。清理测试缓存后重新执行:Angular的测试缓存偶尔会导致奇怪的问题,你可以尝试运行
ng test --no-cache清理缓存后重新执行测试。
内容的提问来源于stack exchange,提问作者SrAxi

