使用RxJS TestScheduler将多个订阅与热的可观察对象进行比较

时间:2015-11-11 22:56:18

标签: javascript system.reactive rxjs

我想要测试以下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没有这个选项,我认为它不是推荐的方式。

思想?

0 个答案:

没有答案