4

アクションによってストア内の状態が変化することを検証するために、Reflux ストアに対して mocha テストを作成しています。コードの縮小版を以下に示します。

店:

var AppStore = Reflux.createStore({
  init: function () {
    this.foo = false;
  },
  listenables: [AppActions],
  onFooAction: function() {
    this.foo = !this.foo;
    this.trigger({action: "foo-ed"});
  };
});

アクション:

var AppActions = Reflux.createActions([
  "fooAction"
]);

テスト:

it("toggles foo", function () {
  expect(AppStore.foo).to.equal(false);

  AppStore.listenables[0].fooAction();

  expect(AppStore.foo).to.equal(true);
});

ただし、2 番目のアサーション ( ) は、それがまだ偽expect(AppStore.foo).to.equal(true);であると言って失敗します。foo

console.logメソッド内で実行することによりonFooAction、メソッドが実際にトリガーされ、this.fooトグルされることを確認しました。

ここで欠けている基本的なものはありますか: 概念的またはその他? タイミングの問題ではないことを心から願っています!

4

1 に答える 1

5

アクションは、ストアがリッスンするイベントを発行します。基本的に、テストの実行速度が速すぎます。

通常、私のテストでは、Reflux が正しく動作すると仮定して、リスナー関数を直接呼び出します。Reflux が正しく配線されていることを確認するために、さらにいくつかのアサーションを追加する必要があります。

it("is configured", function () {
  expect(AppStore.listenables).to.include(AppActions);
  expect(AppActions.fooAction).to.be.a('function');
});

it("toggles foo", function () {
  expect(AppStore.foo).to.equal(false);

  AppStore.onFooAction();

  expect(AppStore.foo).to.equal(true);
});

これをテストするもう 1 つの方法は、タイムアウトを使用することですが、タイムアウトをテスト内に配置すると、気分が悪くなります。

it("toggles foo", function (done) {
  expect(AppStore.foo).to.equal(false);

  AppStore.listenables[0].fooAction();

  setTimeout(function () {
    try {
      expect(AppStore.foo).to.equal(true);
      done();
    } catch (e) {
      done(e);
    }
  }, 15);
});
于 2015-08-17T18:11:28.473 に答える