You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:50:36