测试rxjs的正确方法

问题描述 投票:0回答:2

我带来了书“rxjs in action”并且刚刚完成测试部分。

测试 rxjs 代码与通常的测试不同,因为一切都是延迟加载。

在书中,他们提到了两种测试方法,要么传递done(我正在使用QUnit,done信号异步代码已完成),要么传递大理石图。

我的问题是,我应该选择上面提到的哪种方法?

javascript rxjs rxjs5 rxjs-test-scheduler
2个回答
12
投票

我的同事经常向我提出这个问题。我终于抽出时间在我的博客上记录了我测试 RxJ 的方法。由于您的问题似乎与 RxJs5 有关,我只会在这里引用我的帖子的相关部分。

以 RxJs4 方式在 RxJs5 中进行测试

当您将代码库从 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(); // Note; no longer the Rx.TestScheduler

  const results = scheduler.startScheduler(
    () => Rx.Observable.interval(100, scheduler).take(3),
    { created: 100, subscribed: 200, unsubscribed: 1000 } // NOTE: disposed is now renamed to unsubscribed
  );

  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 的代码库,了解如何设置测试框架来执行您自己的弹珠测试。关于使用 RxJs5 记录测试有一个开放的 问题 。我还没有成功地让我的测试框架设置以这种方式进行弹珠测试。


12
投票
TestScheduler

自己使用这些弹珠测试。它们是以易于理解的格式全面测试一段时间内的排放量、错误、完成情况和订阅的好方法。这是来自

他们的文档
的示例: import { TestScheduler } from 'rxjs/testing'; const testScheduler = new TestScheduler((actual, expected) => { // asserting the two objects are equal // e.g. using chai. expect(actual).deep.equal(expected); }); // This test will actually run *synchronously* it('generate the stream correctly', () => { testScheduler.run(helpers => { const { cold, expectObservable, expectSubscriptions } = helpers; const e1 = cold('-a--b--c---|'); const subs = '^----------!'; const expected = '-a-----c---|'; expectObservable(e1.pipe(throttleTime(3, testScheduler))).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(subs); }); });

如果你使用 Jasmine,我写了 
一个名为

marbleTest()

 的小助手来减少样板代码,
可在 @s-libs/ng-dev
中找到:
import { marbleTest } from "s-ng-dev-utils"; it("generate the stream correctly", marbleTest(helpers => { const { cold, expectObservable, expectSubscriptions, testScheduler } = helpers; const e1 = cold(" -a--b--c---|"); const subs = " ^----------!"; const expected = "-a-----c---|"; expectObservable(e1.pipe(throttleTime(3, testScheduler))).toBe(expected); expectSubscriptions(e1.subscriptions).toBe(subs); }));

© www.soinside.com 2019 - 2024. All rights reserved.