如何在Angular和Jasmine中对退订进行单元测试?

时间:2018-09-17 09:33:44

标签: angular unit-testing jasmine observable

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

private querySubscription: Subscription;

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

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

如何在茉莉花单元测试中测试我是否确实正确取消了订阅?我可以以编程方式调用ngOnDestory(),因为它是公共的,但是我不能测试我的私人班级成员。

2 个答案:

答案 0 :(得分:0)

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

Stackblitz

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

    component.ngOnDestroy();

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

修改1

由于数组符号,此解决方案有效。在javascript中,您没有私有或公共变量:只有变量。

Typescript强制您遵守私人/公共的规定,但是您始终可以解决该问题。

如果您不想这样做,则应创建一个公共函数来创建订阅,如

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

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

由您选择自己喜欢的哪一个!

答案 1 :(得分:-1)

如果您使用的是Typescript,并且我想您要在设置testBed时测试测试模块中的私有成员,则必须使用注入器来调用服务。

beforeEach(() => {
    TestBed.configureTestingModule({
        providers: [
            YourService,
        ],
        imports: [ HttpClientTestingModule ],
    });
    const injector = getTestBed();
    service = injector.get(YourService);
}); 

现在,您可以使用service.myMethod访问您的服务公共方法,并使用(service as any).privateMethod()访问您的私有方法。

由于打字稿总是会编译为JavaScript,因此在JavaScript中,您没有公共私有成员,因此必须使用(service as any)构造。

编辑1

能够访问私有文件后,就可以访问它的属性,因此,您要做的是(使用伪代码):

    spyOn((service as any).privateMethod, 'setBar');

    service.ngOnDestroy()

    expect((service as any).privateMethod.setBar).toHaveBeenCalled();