Angular Jest测试Mock MsalService失败:MSAL_INSTANCE注入缺失求助
问题解决:Angular测试中Mock MsalService失败的问题
你遇到的NullInjectorError是因为你的MockedMsalService继承了MsalService,而MsalService的构造函数依赖MSAL_INSTANCE注入令牌,但测试模块中未提供该依赖。以下是两种可行的解决方案:
方案一:创建独立的Mock类(推荐,轻量简洁)
不需要继承MsalService,只模拟组件实际用到的方法和属性即可,避免引入不必要的依赖:
// 仅模拟组件用到的MsalService成员 class MockMsalService { // 根据组件实际使用情况添加对应的方法/属性 loginPopup = jasmine.createSpy('loginPopup'); logout = jasmine.createSpy('logout'); instance = { getAllAccounts: () => [] // 模拟返回测试所需的账户数据 }; } describe('NavbarComponent', () => { let component: NavbarComponent; let fixture: ComponentFixture<NavbarComponent>; let msalService: MockMsalService; beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [NavbarComponent], providers: [ { provide: MsalService, useClass: MockMsalService }, { provide: Router, useClass: RouterMock }, { provide: UsersService, useClass: UsersServiceMock }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); // 获取注入的Mock服务,方便后续测试中控制行为 msalService = TestBed.inject(MsalService) as unknown as MockMsalService; }); beforeEach(() => { fixture = TestBed.createComponent(NavbarComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); });
方案二:提供MSAL_INSTANCE的Mock依赖(若需继承MsalService)
如果坚持要继承MsalService,需要在测试模块中补充MSAL_INSTANCE的Mock实现:
export class MockedMsalService extends MsalService {} describe('NavbarComponent', () => { let component: NavbarComponent; let fixture: ComponentFixture<NavbarComponent>; beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [NavbarComponent], providers: [ // 补充MSAL_INSTANCE的Mock依赖 { provide: MSAL_INSTANCE, useValue: {} }, { provide: MsalService, useClass: MockedMsalService }, { provide: Router, useClass: RouterMock }, { provide: UsersService, useClass: UsersServiceMock }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(NavbarComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); });
注意:方案一更推荐,因为它只关注组件实际依赖的部分,避免了MsalService内部其他未使用的依赖带来的额外配置成本。
内容的提问来源于stack exchange,提问作者quinzo
相关产品推荐
相关产品推荐

