7

rxjs5 を使用してフラックスを実装する webapp プロジェクトがあり、現在、単体テストを作成するためのソリューションを探しています。

実際、内部にカスタム オブザーバブルを実装しました。たとえば、次のようになります。

function getActivityObservable(events, timeout) {
  return Observable.create((observer) => {
    const deb = debounce(() => observer.next(false), timeout || DEFAULT_TIMEOUT);
    const sub = events.subscribe((e) => {
      if (!e) {
        deb.cancel();
        observer.next(false);
      } else {
        observer.next(true);
        deb(e);
      }
    });

    return () => {
      if (sub) sub.unsubscribe();
      if (deb) deb.cancel();
    };
  }).distinctUntilChanged();
}

大理石のテスト方法を使用してテストし、次のように記述したいと思います(rxjsリポジトリからサンプル例を取得しました)

  describe("getActivityObservable", () => {
    it("should debounce by selector observable", () => {
      const e1 =   hot("--a--bc--d----|");
      const e1subs =   "^             !";
      const expected = "----a---c--d--|";

      expectObservable(e1.debounce(getTimerSelector(20))).toBe(expected);
      expectSubscriptions(e1.subscriptions).toBe(e1subs);
    });
  });

私の質問は:

rxjs5 プロジェクト外で大理石のテスト方法 ( などの演算子を使用) を使用することは可能ですかhot? cold私のプロジェクトでこの素晴らしいツールを使用する方法がわかりません。

ご協力ありがとうございました。

4

1 に答える 1

3

できますが、ベンがコメントしているように、「人間工学に基づいたものではありません」.

モカとサルのパッチを使用していitます:

const isEqual = require('lodash.isequal');
const TestScheduler = require('rxjs/testing/TestScheduler').TestScheduler;

const assertDeepEqualFrame = (actual, expected) => {
  if (!isEqual(actual, expected)) {
    throw new Error('Frames not equal!');
  }
}

const oit = global.it;
global.it = function(description, cb, timeout) {
  if (cb.length === 0) {
    oit(description, function() {
      global.rxTestScheduler = new TestScheduler(assertDeepEqualFrame);
      cb();
      global.rxTestScheduler.flush();
    });
  } else { // async test
    oit.apply(this, arguments);
  }
};

ngrx/store、特にこのファイルから多くのインスピレーションを得ています: https://github.com/ngrx/store/blob/master/spec/helpers/test-helper.ts

そして、次のようにテストを書くことができます:

it('should filter with an always-true predicate', () => {
  const source = hot('-1--2--^-3-4-5-6--7-8--9--|');
  const expected =          '--3-4-5-6--7-8--9--|';
  const predicate = () => { return true; };

  expectObservable(source.filter(predicate)).toBe(expected);
});

編集itここで パッチを適用する方法を見ることができます:

于 2016-09-10T12:02:51.940 に答える