pub*_*orn 12 unit-testing redux-saga
为了100%覆盖我的Saga文件,我正在研究如何测试观察者.
我一直在谷歌搜索,有几个答案如何测试观察者.也就是说,saga是做一个takeEvery或者takeLatest.
但是,所有测试方法似乎都基本上复制了实现.那么编写测试的重点是什么呢?
例:
// saga.js
import { delay } from 'redux-saga'
import { takeEvery, call, put } from 'redux-saga/effects'
import { FETCH_RESULTS, FETCH_COMPLETE } from './actions'
import mockResults from './tests/results.mock'
export function* fetchResults () {
yield call(delay, 1000)
yield put({ type: FETCH_COMPLETE, mockResults })
}
export function* watchFetchResults () {
yield takeEvery(FETCH_RESULTS, fetchResults)
}
Run Code Online (Sandbox Code Playgroud)
测试方法1:
import { takeEvery } from 'redux-saga/effects'
import { watchFetchResults, fetchResults } from '../sagas'
import { FETCH_RESULTS } from '../actions'
describe('watchFetchResults()', () => {
const gen = watchFetchResults()
// exactly the same as implementation
const expected = takeEvery(FETCH_RESULTS, fetchResults)
const actual = gen.next().value
it('Should fire on FETCH_RESULTS', () => {
expect(actual).toEqual(expected)
})
})
Run Code Online (Sandbox Code Playgroud)
测试方法2:使用帮助程序,如Redux Saga测试计划
这是一种不同的编写方式,但我们再次基本上与实现相同.
import testSaga from 'redux-saga-test-plan'
import { watchFetchResults, fetchResults } from '../sagas'
import { FETCH_RESULTS } from '../actions'
it('fire on FETCH_RESULTS', () => {
testSaga(watchFetchResults)
.next()
.takeEvery(FETCH_RESULTS, fetchResults)
.finish()
.isDone()
})
Run Code Online (Sandbox Code Playgroud)
相反,我想知道是否watchFestchResults需要每个FETCH_RESULTS.或者甚至只有它发射takeEvery().无论如何跟进.
或者这真的是这样做的方式吗?
听起来测试它们的目的是实现100%的测试覆盖率.
有些东西可以单元测试,但是如果你应该这是值得怀疑的.
在我看来,这种情况可能是"整合"测试的更好候选者.不能简单地测试单个方法的东西,但是几个方法如何作为一个整体协同工作.也许你可以调用一个动作来触发使用你的传奇的减速器,然后检查商店的结果变化?这比单独测试传奇更有意义.
| 归档时间: |
|
| 查看次数: |
1359 次 |
| 最近记录: |