SpyOn 私有属性,这是一个带有方法的类

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

我的 Angular 应用程序使用

oidc-client
UserManager 类来管理 OAuth 身份验证。

我有以下服务

export class AuthService {
  private userManager: UserManager
  private readonly configService: ConfigService;
  constructor(configService: ConfigService) {
    this.configService = configService;
  }
...
  async load(): Promise<any> {
    config = this.configService.getConfig();
    this.userManager = new UserManager(config);
    const user = await this.userManager.getUser();
...

我的规格文件设置如下:

  beforeEach(() => {
    const spy = jasmine.createSpyObj('UserManager', ['getUser']);
    spy.getUser.and.returnValue(mockUser);
    const configSpy = jasmine.createSpyObj('ConfigService', ['getConfig']);
    configSpy.getConfig.and.returnValue(mockConfig);

    TestBed.configureTestingModule({
      providers: [
        AuthenticationService,
        { provide: UserManager, useValue: spy },
        { provide: AppConfigService, useValue: configSpy }
      ]
    });
    authService = TestBed.inject(AuthenticationService);
    appConfigSpy = TestBed.inject(ConfigService) as jasmine.SpyObj<ConfigService>;
    userManagerSpy = TestBed.inject(UserManager) as jasmine.SpyObj<UserManager>;
  });

...我的第一个测试用例是:

    it('should initialise the user manager', async () => {
      // arrange 
      userManagerSpy.getUser.and.resolveTo(mockUser);
      appConfigSpy.getConfig.and.returnValue(mockConfig);

      // act
      await authService.load();

      // assert
      expect(userManagerSpy).toHaveBeenCalled();
    });

我在运行测试时遇到 404 错误,我猜

new UserManager(config)
和/或
this.userManager.getUser()
在我希望它返回模拟值时试图发出 httpRequest。

如何监视

userManager
并模拟
getUser()
的返回值?

我的理解是 TestBed.configureTestModule 提供者用于设置服务,这些服务被 DI 到服务中,而不是服务本身的成员。

angular typescript jasmine spy
1个回答
0
投票

你需要监视一个构造函数。在 JS 世界你可以做这样的事情

spyOn(window, 'UserManager').andReturn(...);

关于监视构造函数的主题:使用 Jasmine 监视构造函数

而不是...您可以创建一个间谍/模拟,然后检查是否调用了#getUser() 函数。或者您可以简单地为#getUser() 创建 Moco 实现。

但是请记住“每次模拟返回一个模拟仙女死”。换句话说 - 这不是编写测试的最佳方式,它表明代码质量存在问题。如果 UserManager 是在函数内部创建的——它不是服务,我认为它不应该有逻辑。

也许您可以重构代码,使配置用于调用在 AuthService 的构造函数中注入的服务方法?

© www.soinside.com 2019 - 2024. All rights reserved.