如何使用RxJS 5对Observable.interval进行单元测试?

时间:2017-03-20 12:31:35

标签: unit-testing rxjs reactive-programming sinon rxjs5

我有一个非常简单的周期性活动,由RxJS 5安排,我对如何使用RxJS 5对这类代码进行单元测试有点好奇:

start() {
  this._subscription = Observable
                        .interval(this._interval, SchedulerProvider.getScheduler())
                        .subscribe(_ => this.doSomething());
}
stop() {
  this._subscription.unsubscribe();
}

我尝试将我的SchedulerProvider.getScheduler函数存根以在我的测试期间返回new TestScheduler()(默认情况下,它只返回undefined,因此生产代码只使用默认调度程序) - 和然后尝试设置虚拟"滴答"间隔时间:

myTestSchedulerInstance.createColdObservable('xxxxxxxx', {x: 1}); // tick ten times
unitUnderTest.start();
myTestSchedulerInstance.flush();
... assert that doSomething() should be called 10 times ....

但它不起作用。我猜createColdObservablecreateHotObservable只是根据大理石语法输入字符串返回一个新的observable - 但这不会影响我的间隔。

我浏览了文档,现在我对RxJS 5中的大理石测试感到有些困惑,因为文档(以及其他地方)的示例如下所示:

  • 在第一步中:创建一个测试调度程序
  • 然后使用此调度程序创建冷/热可观察
  • 您的被测单位在创建的observable上应用了一些运算符 - 这会产生另一个可观察的
  • 然后使用expectObservable
  • 在结果observable上断言

但我的用例不同。我不想退回Observable.interval,因为我只对订阅的副作用感兴趣。是否可以使用RxJS 5编写这样的测试?

我现在看到的唯一选择:

  • 使用sinon的假定时器
  • start()内,将副作用映射到区间,在订阅后,返回包含副作用的观察点 - >并使用expectObservable
  • 在断言中使用它

但是每个解决方案似乎都有点混乱。

0 个答案:

没有答案