使用 mocha 测试回流商店的状态变化

Posted

技术标签:

【中文标题】使用 mocha 测试回流商店的状态变化【英文标题】:Test state change of a reflux store with mocha 【发布时间】:2015-11-09 02:18:02 【问题描述】:

我正在针对 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 正在被切换。

我在这里缺少什么基本的东西:概念上还是其他方面?我真诚地希望这不是时间问题!

【问题讨论】:

【参考方案1】:

Action 发出商店监听的事件。基本上,您的测试运行得太快了。

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

【讨论】:

以上是关于使用 mocha 测试回流商店的状态变化的主要内容,如果未能解决你的问题,请参考以下文章

从 rxjs 商店中的状态获取最新的 2 个值

Mocha - Chai Unit Terst 报告生成 - NodeJS

在回流中排队异步操作

商店状态更改时反应组件不更新

为啥 VueX 存储在多个单元测试中保留状态?

react-router-redux 5:维护导航中的商店状态历史记录