2

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

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

但是,我很难以产生我认为可读的输出的方式构建测试。在开发人员提供的教程中,他们使用磁带,这基本上允许每个断言产生自己的输出。我觉得这相当不错,因为我可以为 saga 中的每个步骤创建一个输出。

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

将所有步骤作为“它”的文本输入的方法似乎也不实用。我能想出的唯一解决方案是创建单独的 it's 并在生成器上调用 next 越来越多的次数并断言最后一个值,这也不太实用,尤其是在某些步骤获取数据的情况下。

由于我对 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 的能力,因为如果在传奇中存在更多步骤,那么消息会变得很长。

所以我正在寻找的是类似下面的东西,如果我没记错的话,这是一个反模式,因为每个“它”不应该依赖于按顺序修改的全局状态。

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 行输出,每行都指示它是成功还是失败?

4

0 回答 0