Angular MSAL 单元测试服务调用另一个服务

问题描述 投票:0回答:1

我正在尝试测试调用另一个服务的服务。

我有

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
错误。

我的理解正确吗?

  1. 模拟MsalService
  2. 监视被嘲笑的 MsalService
  3. 使用spyOn(service, 'login')运行登录方法
  4. 测试模拟的 MsalService'loginRedirect() 是否使用
    toHaveBeenCalled()
  5. 调用

那为什么会返回错误呢?我的语法错误吗?

我是角度单元测试的新手,所以我非常感谢您的帮助:)谢谢!

angular unit-testing jasmine msal-angular
1个回答
0
投票

您的测试方法似乎存在一些问题。

不必要的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();
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.