首页 > 解决方案 > 在进行 Angular 单元测试时如何使用 SpyOn 函数调用服务

问题描述

我有一个返回用户对象的服务。该服务使用从私有属性设置的公共属性。

private privateProperty: BehaviorSubject<User | Me | null> = new BehaviorSubject(
    null
  );

public publicProperty: Observable<
    User | Me | null
  > = this.privateProperty.asObservable();

服务请求是通过我的组件内的私有方法调用的,我很难在我的单元测试中覆盖它。我不确定如何设置我的测试以命中该私有方法,从而调用该服务并将一些值设置为已定义。

这是我的测试。

it('should set user oninit', ()=> {
    let me: Me | User;

    spyOn(userService, 'publicProperty').and.returnValue(of(userMock));

    component.ngOnInit();

    expect(userService.publicProperty).toHaveBeenCalled();
    expect(component.me).toBeDefined();

  });

但是在运行测试时,我得到了这个失败的结果:

期望(间谍).toHaveBeenCalled()

Expected number of calls: >= 1
Received number of calls:    0

  61 |     component.ngOnInit();
  62 | 
> 63 |     expect(userService.publicProperty).toHaveBeenCalled();
     |                                      ^
  64 |     expect(component.me).toBeDefined();
  65 | 
  66 |   });

我不确定我做错了什么,有没有人让这个工作?

标签: angularjestjs

解决方案


如果您只需要确保组件中的私有方法正在为服务中的 publicProperty 分配值,则可以将普通的期望与服务 publicProperty 一起使用

it('should set user oninit', ()=> {
    let me: Me | User;


    component.ngOnInit();

    expect(userService.publicProperty).toEqual(valueExpected);
    expect(component.me).toBeDefined();

  });

推荐阅读