【发布时间】:2018-03-12 19:42:00
【问题描述】:
我有一个函数,它接受一个数组并返回一个 Observable(本质上是在每次延迟后从给定数组中发出每个值):
export const typewriter = <T>(str: T[], delay = 20) =>
zip(interval(delay), from(str)).pipe(map(([, str]) => str));
我想为此编写单元测试,我正在尝试使用 rxjs-marbles 并遵循 RxJS 的 writing marble tests 说明。
所有示例似乎都需要一个热源 observable 和一个冷 observable 来比较预期值。在这种情况下,我有一个返回冷可观察的函数。我试过这样写:
const expected = m.hot('-^-a-b-(c|)');
const source = typewriter(['a', 'b', 'c']);
m.expect(source).toBeObservable(expected);
但是我总是得到Expected <blank> to equal ...,即源是空白的。我认为这是因为源 Observable 不热,但即使我这样做
source.subscribe() 在断言之前我得到了同样的错误。使用 m.cold 作为测试 observable 无关紧要。
如何使用 RxJS 弹珠测试返回 observable 的函数?
【问题讨论】:
-
我认为(或至少一个)问题是
interval默认使用异步调度程序。您需要将 TestScheduler 传递给它,这意味着您需要扩展您的打字机以采用(可选)调度程序参数,它将转发到from和interval。对于from,它不需要让它工作(我相信),但既然你无论如何都需要添加它,不妨把它做对:-) -
也就是说,对预期状态使用冷可观察对象应该完全没问题。
标签: typescript rxjs