我所看到的所有关于传奇测试的示例都涉及测试函数生成器,但是我花了一点时间来尝试测试导出一系列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的一部分,因此,我也很想找到解决该问题的方法。
答案 0 :(得分:0)
关键基本上是直接测试函数生成器(以下为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))
})
})
这不是我认为理想的解决方案,因为它涉及导出私有实现的详细信息,但是绝对可以进行测试。