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

但是,第二个断言 ( expect(AppStore.foo).to.equal(true);) 未能表明这foo仍然是错误的。

通过console.logonFooAction方法中执行 a,我已经验证了该方法实际上已被触发并且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);
});

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

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 回答