angular - 如何在 Angular 和 Jasmine 中对取消订阅进行单元测试?

标签 angular unit-testing jasmine observable

例如,我的组件中有私有(private)类成员

private querySubscription:订阅;

在我的 ngOnDestroy() 中我取消订阅:

ngOnDestroy(): void { this.querySubscription.unsubscribe(); this.userSettingsSubscription.unsubscribe(); }

如何在 jasmine 的单元测试中测试我是否真的正确取消订阅?我可以编程方式调用 ngOnDestory() 因为它是公开的,但我无法测试我的私有(private)类成员。

最佳答案

你应该模拟你的私有(private)变量(你可以通过数组表示法访问它),然后调用你的函数,并期望订阅被关闭。

Stackblitz

  it('should unsubscribe on destroy', () => {
    component['querySubscription'] = of(true).subscribe();

    component.ngOnDestroy();

    expect(component['querySubscription'].closed).toBeTruthy();
  });

编辑 1

此解决方案之所以有效,是因为数组表示法。在 javascript 中,您没有私有(private)或公共(public)变量:您只有变量。

Typescript 强制您遵守私有(private)/公共(public),但您始终可以解决这个问题。

如果你不想这样做,你应该创建一个公共(public)函数来创建一个像这样的订阅

createSubscription() {
  this.querySubscription = this.someFunction().subscribe();
}

如果您不想使用数组表示法(我忘记说了,这根本不是一个坏习惯),这是唯一可行的解​​决方案。

由你来选择你喜欢的!

关于angular - 如何在 Angular 和 Jasmine 中对取消订阅进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52364687/

相关文章:

c# - checkin 前运行单元测试

javascript - 无法获得涉及 Angular 上的 Jasmine spy 的有效断言

javascript - 如何推迟 Jasmine SpecRunner 的执行

javascript - 两个 Controller 测试套件,其中一个给出 "Error: [ng:areq] Argument ' modalController' 不是函数,未定义”

angular - 带模拟用户输入的 RxJs/Ngrx TestSheduler (Jasmine)

angular - Chunk 不包含延迟加载的组件

javascript - Angular 4/5 : Load dev and prod scripts (3rd party)

angular - <mat-select> 不将 <mat-options> 附加到 cdk-overlay-container

angular - 带数组的 RxJS 运算符

unit-testing - 单元测试抽象类和/或接口(interface)