用 mocha 测试回流存储的状态变化

Test state change of a reflux store with mocha

我正在针对 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);
});

但是,第二个断言 (expect(AppStore.foo).to.equal(true);) 失败了,说明 foo 仍然是错误的。

通过在 onFooAction 方法中执行 console.log,我已验证该方法确实已触发并且 this.foo 正在切换。

这里有什么我遗漏的基本知识吗:概念上的还是其他方面的?真心希望不是时间问题!

操作发出商店侦听的事件。基本上,您的测试 运行 太快了。

通常,在我的测试中,我假设 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);
});

另一种测试方法是使用超时,但是当我在测试中设置超时时,我觉得很脏。

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);
});