如何测试导出一系列效果的传奇?



我看到的所有关于 saga 测试的例子都涉及测试函数生成器,但我正在尝试测试导出一系列 redux 效果的文件。这是我正在使用的内容的基本复制:

// file: mysaga.js
export default [
call(takeEvery, 'startClock', startIt)
]
export function* startIt() {
while ( true ) {
yield call(delay, 1000)
}
}

和测试文件...

// file: mysaga-test.js
import MySagas, { startIt } from './mysaga'
describe('MySaga', () => {
// Using bdd-lazy-var
subject(mySagaWrapper())
it('takes every `startClock`', () => {
expect($subject.next().value).to.eql(call(takeEvery, 'startClock', startIt))
})
it('invokes a delay', () => {
expect($subject.next().value).to.eql(call(delay, 1000))
})
})
function* mySagaWrapper() {
yield* MySagas
}

当我运行测试时,我得到的结果如下所示:

MySaga
✓ takes every `startClock`
1) invokes a delay

1 passing (2ms)
1 failing
1) ClockSagas
invokes a delay:
AssertionError: expected undefined to deeply equal { Object (@@redux-saga/IO, CALL) }
at Context.<anonymous> (...)

如何测试takeEvery之后会发生什么?

另外,我宁愿不必导出*startIt(),因为它不是该文件的公共API的一部分,所以我也渴望找到该问题的解决方案。

关键基本上只是直接测试函数发生器(startIt(),下面(:

import MySaga, {
startIt,
} from './mysaga'
describe('MySaga', () => {
describe('the default export', () => {
subject(mySagaWrapper())
it('takes every `startClock`', () => {
expect($subject.next().value)
.to.eql(call(takeEvery, 'startClock', startIt))
})
})
// THIS right here
describe('startIt()', () => {
subject(startIt())
it('invokes a delay', () => {
expect($subject.next().value)
.to.eql(call(delay, 1000 / 60))
})
})
})
function* mySagaWrapper() {
yield* MySaga
}

如果导出的数组包含多个效果,如下所示:

// file: mysaga.js
export default [
call(takeEvery, 'startClock', startIt),
call(takeEvery, 'foo', doFoo),
]
export function* doFoo() {
}

只需添加另一个测试示例:

describe('the default export', () => {
subject(mySagaWrapper())
it('takes every `startClock`', () => {
expect($subject.next().value)
.to.eql(call(takeEvery, 'startClock', startIt))
})
it('takes every `foo`', () => {
expect($subject.next().value)
.to.eql(call(takeEvery, 'foo', doFoo))
})
})

这不是我认为理想的解决方案,因为它涉及导出私有实现细节,但它绝对使测试成为可能。