如何构建生成器函数的代码/ mocha测试

时间:2016-08-13 21:15:23

标签: javascript ecmascript-6 mocha redux saga

我开始使用react-redux构建一个使用mocha作为测试框架的反应项目。

为了处理异步操作,我最近决定尝试react-saga。 React-saga使用ES6-generator-functions。我发现这更容易测试,因为它省去了模拟函数的麻烦。

然而,我在构建测试时遇到了困难,产生的输出我觉得可读。在开发人员提供的tutorial中,他们使用tape,它基本上允许每个断言产生自己的输出。 我觉得这很好,因为我可以为传奇中的每一步创建一个输出。

有没有办法用mocha实现类似的输出。创建多个"它似乎不是一个选项,因为它需要它们按特定顺序运行。

键入所有步骤作为" it"的文本的方法。看起来也不实用。我能想出的唯一解决方案就是创建单独的它并在生成器上调用下一个次数并在最后一个值上断言,这也是非常实用的,尤其是在某些步骤获取数据的情况下。

由于我对javascript很新,我可能会错过这里显而易见的事情。任何人都可以指出我正确的方向吗?

编辑08/14:添加示例以澄清:

让我们采用教程中提供的示例:

import { put, call } from 'redux-saga/effects'
import { delay } from 'redux-saga'

export function* incrementAsync() {
  // use the call Effect
  yield call(delay, 1000)
  yield put({ type: 'INCREMENT' })
}

使用磁带,他们会像这样测试

test('incrementAsync Saga test', (assert) => {
  const gen = incrementAsync()

  assert.deepEqual(gen.next().value, call(delay, 1000), 'message 1')
  assert.deepEqual(gen.next().value, put({type: 'INCREMENT'}), 'message 2')
  assert.deepEqual(gen.next(), { done: true, value: undefined }, 'message 3')

  assert.end()
});

当我尝试用chai为mocha写这个时,它看起来像这样:

describe('incrementAsync', () => {
  it('waits for a second, dispatches \'INCREMENT\' and is done afterwards', () => {
    const gen = incrementAsync()

    expect(gen.next().value).to.deep.equal(call(delay, 1000))
    expect(gen.next().value).to.deep.equal(put({type: 'INCREMENT'})
    expect(gen.next()).to.deep.equal({ done: true, value: undefined });
  })
})

虽然这几个步骤看起来不错,但我并没有放弃输出我所说的“消息”的能力。在示例中为1到3,因为如果在saga中有多个步骤,则消息将变得非常长。

所以我正在寻找的是类似下面的东西,如果我没有弄错,因为每个"它"不应该依赖于按顺序修改的全局状态。

describe('incrementAsync', () => {
  var gen;

  before(() => {
    gen = incrementAsync()  
  })

  it('waits for a second', () => {
    expect(gen.next().value).to.deep.equal(call(delay, 1000))
  })
  it('then dispatches \'INCREMENT\'', () => {
    expect(gen.next().value).to.deep.equal(put({type: 'INCREMENT'})
  })
  it('is done afterwards', () => {
    expect(gen.next()).to.deep.equal({ done: true, value: undefined });
  })
})

所以我的问题是,如果有一个很好的方法可以做到这一点并且理想地产生3行输出,如果成功或失败则每个都有指示?

0 个答案:

没有答案