例如,我有一个这样的功能:
export function timeRange(start: number, end: number): Rx.Observable<number> {
return Rx.Observable.interval(1000)
.map(n => n + start)
.take(end - start + 1)
}
我有一个运行timeRange(10,100)并针对它声明值的单元测试。
问题是时间间隔会使我的测试时间太长而无法运行。
您如何在不触摸功能本身的情况下缩短时间间隔?
我尝试阅读调度程序上的文档,但没有得到。
有一些警告,但您可以按以下方式测试您的功能:
const Rx = require('rxjs');
const chai = require('chai');
function timeRange(start, end, interval = 1000, scheduler = Rx.Scheduler.async) {
return Rx.Observable.interval(interval, scheduler)
.map(n => n + start)
.take(end - start + 1)
}
let scheduler = new Rx.TestScheduler(chai.assert.deepEqual);
let source = timeRange(2, 8, 50, scheduler);
let values = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8};
scheduler.expectObservable(source).toBe('-----2----3----4----5----6----7----(8|)', values);
scheduler.flush();
需要注意的几点:
该函数现在接受四个参数。间隔和Scheduler
我们需要用来传递的TestScheduler
。
在TestScheduler
需要获得深比较对象的方法。它将用于比较Notification
对象数组。
您无法使用,1000
因为允许的最大时间硬编码为750。请注意,这只是虚拟时间,与实时无关,因此50
我们在此测试中使用的与并不相同50ms
。我们只需要适应该750
时间范围即可。
然后进行大理石测试,作为典型的大理石测试。有关更多信息,请参见https://github.com/ReactiveX/rxjs/blob/master/doc/writing-marble-tests.md。请注意,我不能使用与mocha
默认RxJS运算符相同的全局函数。
我还必须指定值,因为大理石测试默认情况下使用字符串,并且我需要强制使用整数以确保深度相等。
您可以通过更改一个大理石数值来测试是否失败:
let values = {'2': 42, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8};
另外,您可以通过将通知对象打印到控制台来查看它们是什么:
let scheduler = new TestScheduler((actual, expected) => {
console.log('Actual:', actual, '\n\n', 'Expected:', expected);
chai.assert.deepEqual(actual, expected);
});
使用RxJS 5mocha
助手
目前,RxJS 5并未公开mocha
测试助手。我实际上正在我现在正在处理的另一个项目中使用它(包括生成图表图像)。你可以看看这里https://github.com/martinsik/rxjs-extra到package.json
我使用的是什么样的脚本。它运作良好,但设置有点难以理解。它涉及到下载RxJS 5归档,复制一些文件,并用它修补两个文件。然后根据RxJS 5中的原始mocha
设置默认的测试选项mocha.opts
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句