如何测试Jasmine的回调函数中是否取消了订阅的订阅?

时间:2019-01-10 13:36:45

标签: angular jasmine rxjs

我有这个功能:

getCars() {
        const that = this;
        this.carService.getAll().subscribe(function(cars) {
            that.factoryService.setCars(cars);
            this.unsubscribe(); <-------- how do I test this??
        });
    }

我到目前为止编写的单元测试非常简单:

describe('getCars', () => {
    it('should call getAll() from carService, set cars and unsubscribe from getAll()', () => {      
        spyOn(component['carService'], "getAll").and.callThrough();
        spyOn(component['factoryService'], "setCars");
        component.getCars();
        expect(component['carService'].getAll).toHaveBeenCalled();
        expect(component['factoryService'].setCars).toHaveBeenCalled();

    });
  });

但是如何测试this.unsubscribe()行?如何访问this

2 个答案:

答案 0 :(得分:1)

您的代码看起来很混乱。我建议您不要调用退订,而要使用takeUntil。当组件被销毁时,TakeUntil将监听接收一个值的流。

只需使用以下库: https://www.npmjs.com/package/@w11k/ngx-componentdestroyed

getCars() {
    this.carService.getAll()
        .pipe(
            untilComponentDestroyed(this)
        )
        .subscribe(cars => {
            that.factoryService.setCars(cars);
        });
}

从这开始,您只需要确保实现OnDestroy接口即可。

另一种更好的解决方案:在模板中使用|异步管道。

答案 1 :(得分:1)

您可以将Subscription分配给公共变量,并测试取消订阅方法的调用,例如:

this.subscription = this.carService.getAll().subscribe(cars => {
 this.factoryService.setCars(cars);
 this.subscription.unsubscribe();
});

正在测试

expect(component.subscription.unsubscribe).toHaveBeenCalled();