使用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
使用的是“虚拟时间”。那么如何测试此功能?
最后非常简单,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
});