如何在Jest中测试基于计时器的RxJS可观察量

时间:2018-01-24 17:10:06

标签: javascript node.js unit-testing jestjs

我是RxJS的新手,对于使用Jest进行单元测试非常新,我在尝试测试一些模拟的RxJS可观察量时遇到了一个相当混乱的问题。

为了模仿数据流,我在测试spec.js文件中创建了一个Observable,如下所示:

var Rx = require("rx");

var source = Rx.Observable.interval(500).take(10);

source.subscribe(
    function(x){ console.log(x) },
    function(e){ console.log(e) },
    function(){ console.log('completed') }
  );

虽然这只是作为节点脚本运行时正确记录,但在npm test运行时它并没有记录任何内容。 Observable.delaysetTimeout功能似乎也不起作用。

1 个答案:

答案 0 :(得分:0)

这对我有用:

var Rx = require("rx");

describe("Interval Test", () => {
  const source = Rx.Observable.interval(100);
  let count = 0;
  source.subscribe(
  x => count++,
  e => console.log("error: ", e),
  () => console.log("complete"));

  it("run for 1 second", done => {
    setTimeout(() => {
      console.log('one second passed');
      expect(count).toBe(10);
      done();
    }, 1010)
  });
});

似乎我需要在我的it测试函数中放置一个timeOut,以便能够执行此异步observable。同样非常重要的是done()调用,以防止时间无限期地运行。

注意:或者,如果您想使用Jest的假时间手动控制时间,那么这似乎也有效。我发现我不需要使用VirtualTimeScheduler。

jest.useFakeTimers();    
var Rx = require("rx");

var source = Rx.Observable.interval(500).take(10);

source.subscribe(
    function(x){ console.log(x) },
    function(e){ console.log(e) },
    function(){ console.log('completed') }
  );
jest.runAllTimers();