例如,我的组件中有私有类成员
private querySubscription: Subscription;
。
在我的ngOnDestroy()
中,我取消了订阅:
ngOnDestroy(): void {
this.querySubscription.unsubscribe();
this.userSettingsSubscription.unsubscribe();
}
如何在茉莉花单元测试中测试我是否确实正确取消了订阅?我可以以编程方式调用ngOnDestory()
,因为它是公共的,但是我不能测试我的私人班级成员。
答案 0 :(得分:0)
您应该模拟您的私有变量(可以通过数组表示法访问它),然后调用函数,并期望子预订被关闭。
it('should unsubscribe on destroy', () => {
component['querySubscription'] = of(true).subscribe();
component.ngOnDestroy();
expect(component['querySubscription'].closed).toBeTruthy();
});
由于数组符号,此解决方案有效。在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();