【问题标题】:Typescript (Angular) : unit test a subscriptionTypescript(Angular):对订阅进行单元测试
【发布时间】:2017-11-23 00:49:56
【问题描述】:

我有一个简单的函数可以做到这一点

ngOnInit() {
  if (this.session.getToken()) {
    this.isUserLogged = true;
  }

  this.loadingObserver = this.session.loadingObservable.subscribe(loading => this.isLoading = loading);
}

我的测试如下

it('Testing ngOnInit() ...', async(() => {
  let spy = spyOn(services.session, 'getToken').and.returnValue('token');
  services.session.loadingObservable.subscribe(any => expect(component.isLoading).toEqual(false));
  component.ngOnInit();
  expect(component.isUserLogged).toEqual(true);
  expect(spy).toHaveBeenCalled();
}));

但在我的应用程序的代码覆盖范围内,订阅没有被覆盖。事实上,期待 false 也有效。

您对如何测试订阅有任何想法吗?

【问题讨论】:

  • 我会检查是否为您找到了解决方案,但我觉得测试是否定义了订阅就足够了,或者您可能会触发 loadingObservable 将 isLoading 切换为 true 或 false。
  • 仅测试订阅不会测试 isLoading 是否具有正确的值,这就是我卡住的地方。我认为只有订阅它才会允许断言,但它似乎没有......

标签: angular unit-testing typescript jasmine


【解决方案1】:

您的处理程序代码是否在订阅时被调用取决于您订阅的 Observable 的性质——特别是它的“热度”或“冷度”。阅读这个出色的解释——https://blog.thoughtram.io/angular/2016/06/16/cold-vs-hot-observables.html——看看你的“loadingObservable”在分类中的位置。但我怀疑正如 cmets 中所建议的那样,您需要在单元测试中强制它触发。

【讨论】:

  • 伙计,那是旧的!从那以后我已经走了很远,但感谢您的阅读!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2021-06-28
  • 2019-04-15
相关资源
最近更新 更多