【问题标题】:How to call a service with SpyOn function when doing Angular Unit Test在进行 Angular 单元测试时如何使用 SpyOn 函数调用服务
【发布时间】:2020-06-26 06:31:54
【问题描述】:

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

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();

  });

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

expect(spy).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 |   });

我不确定我做错了什么,以前有没有人解决过这个问题?

【问题讨论】:

  • publicProperty 不是方法,而是属性。您需要设置不同类型的间谍 - spyOnProperty
  • 我尝试设置 spyOnProperty - 但我找不到名称 'spyOnProperty' - 没有快速修复
  • 这是另一个问题,但spyOnProperty 在这种情况下将是最有效的方法
  • 用玩笑测试。,这似乎是问题

标签: angular jestjs


【解决方案1】:

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

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


    component.ngOnInit();

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

  });

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多