我想要测试以下getPriceStream
方法:
import Rx from 'rx';
export default class TradingService {
constructor() {
this.subscribedCcyStreams = {};
}
getPriceStream(ccyPair) {
let existingStream = this.subscribedCcyStreams[ccyPair];
if (existingStream)
return existingStream;
let newStream = Rx.Observable.create(obs => {
// subscribe to live service here once we have one
var ccyStream = Rx.Observable.interval(500, Rx.Scheduler.default)
.map(_ => this.createFakePrice(ccyPair))
.subscribe(obs);
return () => {
ccyStream.dispose();
delete this.subscribedCcyStreams[ccyPair];
};
})
.replay(1)
.refCount();
return this.subscribedCcyStreams[ccyPair] = newStream;
}
createFakePrice(ccyPair) {
return {
ccyPair: ccyPair,
price: Math.random() + 1,
timestamp: Date.now()
};
}
}
我想测试下面的第一个和最后一个订阅会产生匹配值(因为它们具有相同的ccy对,因此应该返回相同的热可观察值),第二个应该具有不同的值。
tradingSvc.getPriceStream('GBPAUD').subscribe();
tradingSvc.getPriceStream('EURUSD').subscribe();
tradingSvc.getPriceStream('GBPAUD').subscribe();
对于一个订阅,我只需将Rx.Scheduler.default
设置为使用我的TestScheduler
,然后使用以下内容运行调度程序并记录值:
var testScheduler = new Rx.TestScheduler();
Rx.Scheduler.default = testScheduler;
var results = testScheduler.startScheduler(
() => tradingSvc.getPriceStream('GPBAUD'),
{created: 0, subscribed: 0, disposed: 10000});
但是,我不确定如何对一个函数进行3次单独调用,这会产生2个不同的流。在Rx.NET中,我以前只会通过.subscribe()
正常订阅3个调用,将每个订阅的值推送到集合中,然后通过advanceBy(x)
的使用逐步控制共享的TestScheduler。但是RxJS TestScheduler没有这个选项,我认为它不是推荐的方式。
思想?