我想找到一种方法来测试订阅和主题上的取消订阅函数调用。
我想出了一些可能的解决方案,但每一种都有优点和缺点。请记住,我不想出于测试目的而更改变量的访问修饰符。
- 通过反射访问组件的私有变量。
在这种情况下,我有一个存储订阅的私有类变量:
组件.ts:
private mySubscription: Subscription;
//...
ngOnInit(): void {
this.mySubscription = this.store
.select(mySelector)
.subscribe((value: any) => console.log(value));
}
ngOnDestroy(): void {
this.mySubscription.unsubscribe();
}
组件规格:
spyOn(component['mySubscription'], 'unsubscribe');
component.ngOnDestroy();
expect(component['mySubscription'].unsubscribe).toHaveBeenCalledTimes(1);
pros:
- 我可以到达我的订阅。
- 我可以测试取消订阅方法是在右侧调用的
订阅。
cons:
- 我只能通过反思才能达到我的订阅,如果可能的话我想避免这种情况。
- 我创建了一个用于订阅的变量,就像选项 1 中一样,但我没有通过反射访问该变量,而是简单地检查取消订阅方法是否已被调用,而不知道来源。
组件.ts:与选项 1 相同
组件规格:
spyOn(Subscription.prototype, 'unsubscribe');
component.ngOnDestroy();
expect(Subscription.prototype.unsubscribe).toHaveBeenCalledTimes(1);
pros:
cons:
- 我实现了一个辅助函数,它对传递的订阅参数调用取消订阅方法。
订阅.helper.ts:
export class SubscriptionHelper {
static unsubscribeAll(...subscriptions: Subscription[]) {
subscriptions.forEach((subscription: Subscription) => {
subscription.unsubscribe();
});
}
}
组件.ts:与选项 1 相同,但 ngOnDestroy 不同:
ngOnDestroy(): void {
SubscriptionHelper.unsubscribeAll(this.mySubscription);
}
组件规格:
spyOn(SubscriptionHelper, 'unsubscribeAll');
component.ngOnDestroy();
expect(SubscriptionHelper.unsubscribeAll).toHaveBeenCalledTimes(1);
pros:
cons:
你们有什么建议?如何在单元测试中测试清理工作?