我正在尝试测试调用另一个服务的服务。
我有
auth.service.ts
,其中包含调用 MsalService.loginRedirect();
的登录方法。
import { Inject, Injectable } from '@angular/core';
import {
MSAL_GUARD_CONFIG,
MsalGuardConfiguration,
MsalService,
} from '@azure/msal-angular';
import { RedirectRequest } from '@azure/msal-browser';
@Injectable({
providedIn: 'root',
})
export class AuthService {
constructor(
@Inject(MSAL_GUARD_CONFIG) private msalGuardConfig: MsalGuardConfiguration,
private msalService: MsalService
) {}
login(): void {
if (this.msalGuardConfig.authRequest) {
this.msalService.loginRedirect({
...this.msalGuardConfig.authRequest,
redirectStartPage: '/',
} as RedirectRequest);
} else {
this.msalService.loginRedirect();
}
}
}
和规格文件
import { TestBed } from '@angular/core/testing';
import { MsalAuthModule } from '@app/core/msal.module';
import { AuthService } from './auth.service';
import { MsalService } from '@azure/msal-angular';
import { MockService } from 'ng-mocks';
describe('AuthService', () => {
let service: AuthService;
const mockMsalService = MockService(MsalService, {
loginRedirect: void {},
});
let msalServiceSpy: jasmine.SpyObj<MsalService>;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [MsalAuthModule],
providers: [{ provide: MsalService, useValue: mockMsalService }],
});
service = TestBed.inject(AuthService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
it('should login', () => {
spyOn(service, 'login'); // <- runs login method from service?
msalServiceSpy = jasmine.createSpyObj(mockMsalService, ['loginRedirect']); // <- creates spy?
expect(msalServiceSpy).toHaveBeenCalled(); // <- test if msalService.login() is called
});
});
但是我收到了
Expected a spy
错误。
我的理解正确吗?
toHaveBeenCalled()
那为什么会返回错误呢?我的语法错误吗?
我是角度单元测试的新手,所以我非常感谢您的帮助:)谢谢!
您的测试方法似乎存在一些问题。
不必要的spyOn(service, 'login')
调用服务上的登录方法
import { TestBed } from '@angular/core/testing';
import { MsalAuthModule } from '@app/core/msal.module';
import { AuthService } from './auth.service';
import { MsalService, RedirectRequest } from '@azure/msal-angular';
import { MockService } from 'ng-mocks';
describe('AuthService', () => {
let service: AuthService;
let msalService: jasmine.SpyObj<MsalService>;
beforeEach(() => {
const mockMsalService = MockService(MsalService, ['loginRedirect']);
TestBed.configureTestingModule({
imports: [MsalAuthModule],
providers: [{ provide: MsalService, useValue: mockMsalService }],
});
service = TestBed.inject(AuthService);
msalService = TestBed.inject(MsalService) as jasmine.SpyObj<MsalService>;
});
it('should be created', () => {
expect(service).toBeTruthy();
});
it('should login', () => {
service.login();
expect(msalService.loginRedirect).toHaveBeenCalled();
});
});