对redux-saga观察者进行单元测试有什么意义?

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().无论如何跟进.

或者这真的是这样做的方式吗?

Joh*_*yer 8

听起来测试它们的目的是实现100%的测试覆盖率.

有些东西可以单元测试,但是如果你应该这是值得怀疑的.

在我看来,这种情况可能是"整合"测试的更好候选者.不能简单地测试单个方法的东西,但是几个方法如何作为一个整体协同工作.也许你可以调用一个动作来触发使用你的传奇的减速器,然后检查商店的结果变化?这比单独测试传奇更有意义.