如何在rxjs 5中测试使用定时间隔返回可观察值的函数?

khoomeister

例如,我有一个这样的功能:

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-extrapackage.json我使用的是什么样的脚本。它运作良好,但设置有点难以理解。它涉及到下载RxJS 5归档,复制一些文件,并用它修补两个文件然后根据RxJS 5中的原始mocha设置默认的测试选项mocha.opts

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在RxJS中按特定时间量将可观察值分开

如何在 rxjs 可观察数组中以角度添加项目

稍后如何在 rxjs 可观察流中使用属性?

rxjs如何在角度服务中一起返回可观察到的值

如何在RxJS(或Reactive Extensions中的常规)中实现可观察到的时间到期热

如何使用RxJS可观察的订阅调用中的值

如何在Angular Jasmine Spec中测试主题和可观察到的返回值?

如何在RxJs 5中将主题转换为可观察对象

如何在订阅期间从可观察的Angular 5 RxJS中检查NULL结果?

如何在 Angular 5 中使用 rxJS 存储来自 API 的可观察数据?

如何在Jasmine中测试RxJs WebSocket

如何在Angular 7中将服务函数作为可观察值返回?

如何在 RXJS 6 中减去 2 个观察值

如何在RXJS中延迟发出值?

在rxjs中,如何使用takeUntil或takeWhile取消订阅“内部”“间隔”的可观察对象

如何在RxJS中创建Cold Subject?

异步流如何在RXJS中传输?

如何在RxJS中完成Observable

如何在RxJS 5.5中捕获错误

如何在 RxJS 中使用 await

如何在零时间内获取RxJS可观察事件?

如何破坏/停止可观察的时间间隔

如何在RxJS中处理条件可观测对象

使用RxJS过滤单个值并返回可观察到的值,并通过Angular模板中的async使用可观察到的值

如何退订可观察的RxJS 5?

如何在rxjs中启动后停止间隔

如何在Rxjs中缓冲一个简单的可观察对象?

如何在 rxjs 中组合一系列可观察的

如何在Angular / RxJS中合并两个可观察对象?