我是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.delay
和setTimeout
功能似乎也不起作用。
答案 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();