私は、APIの呼び出しを行い、結果を処理し、次のReduxの佐賀、持っている:私はすべてがこれらの冗談で動作するかどうかをテストしていは、手動発電機に値を渡すと、冗談テストで予期しない結果が得られ
import { takeLatest } from 'redux-saga'
import { call, put } from 'redux-saga/effects'
import { normalize, arrayOf } from 'normalizr'
import * as actions from './actions'
import * as schemas from './schemas'
import * as types from './actionTypes'
import { api, constants as apiConstants } from '../../services/api'
export function* fetchWorks() {
const { response, error } = yield call(api.getJson, apiConstants.WORKS_ENDPOINT)
if (response) {
const normalized = normalize(response.items, arrayOf(schemas.works))
yield put(actions.fetchWorksSuccess(normalized))
} else {
yield put(actions.fetchWorksFail(error))
}
}
を試験は:
import { takeLatest } from 'redux-saga'
import { call, put } from 'redux-saga/effects'
import * as sagas from './sagas'
import * as actions from './actions'
import * as types from './actionTypes'
import { api, constants as apiConstants } from '../../services/api'
describe('works saga',() => {
describe('fetchWorks',() => {
it('should fetch data',() => {
const generator = sagas.fetchWorks()
const actual = generator.next().value
const expected = call(api.getJson, apiConstants.WORKS_ENDPOINT)
expect(actual).toEqual(expected)
})
// this test requires me to pass a response object to the generator
it('should put fetchWorksSuccess on a response',() => {
// so I create it here
const response = {
items: [{
sys: { id: '1' },
fields: { content: 'content' }
}]
}
const generator = sagas.fetchWorks()
const expected = put(actions.fetchWorksSuccess())
// but I would expect to pass it here
generator.next()
// but actually the test only succeeds if I pass it here
const actual = generator.next({ response }).value
expect(actual).toEqual(expected)
})
// same goes for this test
it('should put fetchWorksFail on errors',() => {
const error = new Error('Something went wrong')
const generator = sagas.fetchWorks()
const expected = put(actions.fetchWorksFail())
generator.next()
const actual = generator.next({ error }).value
expect(actual).toEqual(expected)
})
})
})
しかし、'should put fetchWorksSuccess on a response'
と'should put fetchWorksFail on errors'
試験のため、私は手動でそれぞれ発電機に{response}
と{error}
オブジェクトを通過しなければなりません。
私はこれらのオブジェクトが必要であることを理解しています(応答があるかどうかを調べるif文のため)。なぜ最初の代わりに2番目の.next()
に渡す必要があるのか分かりません。私がそれを見る方法では、最初のyield
は応答またはエラーオブジェクトであり、2番目のものではありません。なぜ誰かが理解していますか?
ありがとうございます。 MDNのドキュメントは、私がそれを理解するのに本当に役立たなかった。この記事(https://davidwalsh.name/es6-generators)とcodepen(https://codepen.io/anon/pen/GNbRpe?editors=0010)を試してみると、私の理解に役立ちました。ありがとう! –