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

Flo*_*geb 5 unit-testing observable jasmine angular

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

private querySubscription: Subscription;

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

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

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

Mac*_*c_W -1

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

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

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

由于 Typescript 始终编译为 JavaScript,并且在 JavaScript 中,您没有公共私有成员,因此您必须使用该(service as any)构造。

编辑1

在您能够访问私有之后,您可以访问它的属性,因此您接下来要做的是(以伪代码形式):

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

    service.ngOnDestroy()

    expect((service as any).privateMethod.setBar).toHaveBeenCalled();
Run Code Online (Sandbox Code Playgroud)