使用rxjs的集成测试geteventstore具有竞争条件

时间:2015-07-07 21:23:54

标签: node.js rxjs event-loop get-event-store

对不起,这个有点乱。我的项目是在nodejs。我在摩卡测试。在其中我打开了与geteventstore的连接并订阅了一个流。这基本上开始发射事件。

我将该事件订阅包装在rxjs observable中,然后将其写入控制台。

有一半的时间我在一半的时间内得到了充满活动的信息流。

我感觉到eventloop开始倾听,没有听到任何声音并关闭,然后geteventstore才能开始用事件进行爆破。

我有点失落。我可以告诉geteventstore发送数据的时间是我得到它的一半时间。我的理解是,只要有人订阅了一个事件,例如有一个eventlistener,循环将保持打开状态。

所以问题可能在于rxjs?

我不知道,任何帮助将不胜感激。

---- EDIT

我不知道这是否会有所帮助,但测试看起来像这样。

context('when calling subscription', ()=> {
    it('should stay open', function () {
        mut = bootstrap.getInstanceOf('gesConnection');
        var rx = bootstrap.getInstanceOf('rx');
        var subscription = mut.subscribeToAllFrom();

        rx.Observable.fromEvent(subscription, 'event').forEach(x=> console.log(x));

        subscription.on('event', function (payload) {
            console.log('event received by dispatcher');
            console.log('event processed by dispatcher');
        });
        mut._handler._connectingPhase.must.equal('Connected');
    })
});

所以mut是与geteventstore的连接,rx是rxjs,而订阅对象是一个事件发送器,它将数据从geteventstore中抽出。

我理解这个问题是因为它至少处理了两个不同寻常的产品,即geteventstore和rxjs。

我的意思是我非常确信gesConnection和订阅实际上是连接和发送的。我只是不知道如何进一步测试/调查。

谢谢

1 个答案:

答案 0 :(得分:1)

我没有看到你使用Mocha's async testing facilities

MochaJs不知道它应该等待你的测试更长的时间,而不是你的函数返回。

通常你会回复一个承诺:

    it('must stay open', () => {
        mut = bootstrap.getInstanceOf('gesConnection');
        var rx = bootstrap.getInstanceOf('rx');
        var subscription = mut.subscribeToAllFrom();

        subscription.on('event', function (payload) {
            console.log('event received by dispatcher');
            console.log('event processed by dispatcher');
        });

        var promise = rx.Observable
            .fromEvent(subscription, 'event')
            .take(100) // stop test after 100 events
            .do(x => console.log(x))
            .finally(() => {
                // do any cleanup here.
                // such as close your connection
                // or "subscription" variable
            })
            .toPromise();

        mut._handler._connectingPhase.must.equal('Connected');

        // tells Mocha to wait until the observable completes
        return promise;
    });