我最近从同事那里频繁听到这个问题。最终我在我的博客上记录了一下如何测试RxJs,点此查看。由于你的问题似乎与RxJs5有关,因此我将在此处引用我文章中相关的部分。
RxJs5中像RxJs4一样进行测试
当您将代码库从RxJs4迁移到5时,您会发现很多东西已经被移动、重命名,而且最重要的是TestScheduler的实现不再可用。 RxJs贡献者kwonoj创建了一个兼容性工具来帮助迁移到RxJs5。您可以使用npm安装它 npm install @kwonoj/rxjs-testscheduler-compat
。并非所有的TestScheduler功能都已实现,但最重要的.startScheduler
正在工作。
const TestScheduler = require('@kwonoj/rxjs-testscheduler-compat').TestScheduler;
const next = require('@kwonoj/rxjs-testscheduler-compat').next;
const complete = require('@kwonoj/rxjs-testscheduler-compat').complete;
it('works in RxJs5 with the compat package', () => {
const scheduler = new TestScheduler();
const results = scheduler.startScheduler(
() => Rx.Observable.interval(100, scheduler).take(3),
{ created: 100, subscribed: 200, unsubscribed: 1000 }
);
collectionAssert.assertEqual(res.messages, [
next(200 + 100, 0),
next(200 + 200, 1),
next(200 + 300, 2),
complete(200 + 300)
]);
});
使用新的 Marble 测试语法测试 RxJs5
RxJs 团队引入了 Marble 测试语法,更直观地定义您的操作符或自定义代码应该如何运行。
var e1 = hot('----a--^--b-------c--|');
var e2 = hot( '---d-^--e---------f-----|');
var expected = '---(be)----c-f-----|';
expectObservable(e1.merge(e2)).toBe(expected);
在撰写本文时,他们尚未使此方法在 RxJs5 库之外真正易于使用。有可供参考的实现,以了解如何自行完成。您也可以在 RxJs5 的代码库 中查看如何设置测试框架以进行自己的 marble 测试。关于使用 RxJs5 进行测试的文档化问题存在一个开放性问题。我尚未成功地设置我的测试框架以使用这种方式进行 marble 测试。