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(); });
错误原因说明
- 原代码中
jasmine.createSpyObj('MsalService', ['instance', 'getAllAccounts'])将instance当作MsalService的方法处理,导致msalServiceMock.instance是一个Spy方法而非对象,后续无法对其getAllAccounts方法进行Spy。 - 修正后先创建包含
getAllAccounts的instanceMock对象,再将其赋值给MsalServiceMock的instance属性,这样组件中调用this.msalService.instance.getAllAccounts()时会指向Mock的方法。
内容的提问来源于stack exchange,提问作者EliasM
相关产品推荐
相关产品推荐

