如何模拟用户在rxjs TestScheduler单元测试中经过一段时间后触发取消订阅?

问题描述 投票:1回答:1

使用rxjs TestScheduler,我具有以下工作单元测试:

import { TestScheduler } from 'rxjs/testing';


it('test', () => {
    testScheduler.run(helpers => {

        const { expectObservable } = helpers;
        const expectedMarbles = 'a 999ms b 999ms (c|)';

        const expectedValues = {
          a: undefined,
          b: returnedValue1,
          c: returnedValue2
        };

        const rtiDataSource: RealTimeDataSource = TestBed.get(RealTimeDataSource);

        rtiDataSource.init(RTIConfig.rtiConfig);

        const result = rtiDataSource.observe(tennantId, jwt);

        expectObservable(result.Observable).toBe(expectedMarbles, expectedValues);

    });
}

这一切都按预期进行。我还有一个额外的工作流程,如果用户取消订阅,则会触发其他操作。这样实现:

$requestPipe: Observable<any> = //main polling functionality
        .pipe(
           finalize(() => {
               //cleaning up logic here...
           })
         );    

return $requestPipe;

我需要测试此功能。因此,我要执行的操作是使用TestScheduler触发测试,然后在第一个发射后我要unsubscribe。像这样的东西:

testScheduler.run(helpers => {

    const { expectObservable } = helpers;
    const expectedMarbles = 'a 999ms |';
    //                               ^ unsubscribe would happen here and stop emitting 

    const expectedValues = {
      a: undefined,
    };

    const rtiDataSource: RealTimeDataSource = TestBed.get(RealTimeDataSource);

    rtiDataSource.init(RTIConfig.rtiConfig);

    const result = rtiDataSource.observe(tennantId, jwt);

    setTimeout(() => {

      result.Unsubscribe();

    }, (1000));

    expectObservable(result.Observable).toBe(expectedMarbles, expectedValues);

});

但是在此示例中,setTimeout没有运行,因为TestScheduler使用的是“虚拟时间”。那么如何测试此功能?

unit-testing rxjs jestjs rxjs6 rxjs-test-scheduler
1个回答
0
投票

最后非常简单,TestScheduler库给我留下了深刻的印象。如果您遇到这种问题,我会推荐reading the docs

该库支持语法来指定订阅开始和结束的时间,因此您可以非常简单地模拟我的方案:

testScheduler.run(helpers => {

    const { expectObservable } = helpers;
    const expectedMarbles = '   a 999ms -';
    const subscritionMarbles = '^ 999ms !';
    //simulate the subscription ^       ^ simulate the unsubscription

    const expectedValues = {
      a: undefined,
    };

    const rtiDataSource: RealTimeDataSource = TestBed.get(RealTimeDataSource);

    rtiDataSource.init(RTIConfig.rtiConfig);

    const result = rtiDataSource.observe(tennantId, jwt);

    expectObservable(result.Observable, subscritionMarbles).toBe(expectedMarbles, expectedValues);
    // pass subscritionMarbles into the expectObservable

});
© www.soinside.com 2019 - 2024. All rights reserved.