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