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

Angular 15中Jasmine Mock MsalService.getAllAccounts方法报错

解决Angular中MsalService.instance.getAllAccounts的Jasmine Mock问题

你的问题根源在于错误地将instance当作MsalService的方法来Mock,而实际上instance是MsalService的属性,它本身是一个包含getAllAccounts方法的对象。下面是修正后的测试代码:

步骤1:正确Mock MsalService和其instance属性

修改login.spec.ts中的beforeEach块,先Mockinstance对象,再将其赋值给MsalService的Mock实例:

let msalInstanceMock: jasmine.SpyObj<any>;
let msalServiceMock: jasmine.SpyObj<MsalService>;    

beforeEach(waitForAsync(() => {
    // 1. Mock Msal的instance对象,包含getAllAccounts方法
    msalInstanceMock = jasmine.createSpyObj('MsalInstance', ['getAllAccounts']);
    // 2. 创建MsalService的Mock,无需将instance列为方法
    msalServiceMock = jasmine.createSpyObj('MsalService', []);
    // 3. 将Mock的instance赋值给MsalService的instance属性
    msalServiceMock.instance = msalInstanceMock;

    TestBed.resetTestingModule();
    TestBed.configureTestingModule({
        imports: [
            RouterTestingModule.withRoutes(
                [{path: 'home', component: HomeComponent}]
            ),
        ],
        providers: [
            {provide: MsalService, useValue: msalServiceMock}
        ],
        declarations: [LoginComponent]
    }).compileComponents();
}));

步骤2:在测试用例中设置返回值

在测试用例中直接通过msalInstanceMock设置getAllAccounts的返回数据:

it('checkAndSetActiveAccount() check and validate Active Account', () => {
    const mockAccounts = [
        { homeAccountId: '', environment:'', tenantId:'', username:'', localAccountId:'' }
    ];
    // 设置getAllAccounts的返回值
    msalInstanceMock.getAllAccounts.and.returnValue(mockAccounts);
    
    component.checkAndSetActiveAccount();
    
    // 可选:添加断言验证方法调用
    expect(msalInstanceMock.getAllAccounts).toHaveBeenCalled();
});

错误原因说明

  1. 原代码中jasmine.createSpyObj('MsalService', ['instance', 'getAllAccounts'])将instance当作MsalService的方法处理,导致msalServiceMock.instance是一个Spy方法而非对象,后续无法对其getAllAccounts方法进行Spy。
  2. 修正后先创建包含getAllAccounts的instance Mock对象,再将其赋值给MsalService Mock的instance属性,这样组件中调用this.msalService.instance.getAllAccounts()时会指向Mock的方法。

内容的提问来源于stack exchange,提问作者EliasM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:27:18