我有一个函数,它接受一个数组并返回一个可观察的值(实质上是在每次延迟之后从给定数组中发出每个值):
export const typewriter = <T>(str: T[], delay = 20) =>
zip(interval(delay), from(str)).pipe(map(([, str]) => str));我想为此编写单元测试,我正在尝试使用rxjs-弹珠并遵循来自RxJS的书写大理石试验指令。
所有的例子似乎都需要一个可以观察到的热源和一个可以观察到的冷源来比较期望值。在这种情况下,我有一个函数,返回一个冷的,可观察的。我试过这样写:
const expected = m.hot('-^-a-b-(c|)');
const source = typewriter(['a', 'b', 'c']);
m.expect(source).toBeObservable(expected);然而,我总是得到Expected <blank> to equal ...,即源是空的。我认为这是因为可观察到的源并不热,但是即使我在断言之前做了source.subscribe(),我也会得到相同的错误。使用m.cold进行可观察的测试并不重要。
如何测试使用RxJS弹珠返回可观察到的函数?
发布于 2018-03-12 23:45:08
您的typewriter函数使用可观察到的interval创建者,但只传递delay。这意味着它将使用创建者的默认调度程序。
为了与大理石测试一起使用,它需要使用TestScheduler --可以通过m.scheduler获得。
将测试调度程序传递给可观察到的深度嵌套的测试调度程序是一件痛苦的事情。rxjs-marbles包括一个bind方法--参见医生们 --以使这一点变得更容易:
m.bind();
const expected = m.hot('-^-a-b-(c|)');
const source = typewriter(['a', 'b', 'c']);
m.expect(source).toBeObservable(expected);调用绑定猴子补丁--所有调度程序--将调用转发到测试的TestScheduler。
https://stackoverflow.com/questions/49243276
复制相似问题