Ich habe folgende redux Saga, die einen API-Aufruf macht und verarbeitet die Ergebnisse:manuell einen Wert an einen Generator vorbei führt zu unerwarteten Ergebnisse mit Scherz Tests
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))
}
}
Ich teste, ob alles mit diesem Scherz funktioniert Tests:
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)
})
})
})
jedoch für die 'should put fetchWorksSuccess on a response'
und 'should put fetchWorksFail on errors'
Tests habe ich jeweils eine {response}
und {error}
Objekt in jedem Generator manuell zu übergeben.
Ich verstehe, dass diese Objekte notwendig sind (wegen der if-Anweisung, die prüft, ob es eine Antwort gibt), aber ich verstehe nicht, warum ich es an die zweite .next()
anstelle der ersten weitergeben muss? Weil die Art, wie ich es sehe, die erste yield
ergibt das Antwort- oder Fehlerobjekt, nicht die zweite. Versteht jemand warum?
Ah ok. Die MDN-Dokumente haben mir nicht wirklich geholfen, das zu verstehen. Ihre Antwort, kombiniert mit diesem Artikel (https://davidwalsh.name/es6-generators) und dem Experimentieren mit Codepen (https://codepen.io/anon/pen/GNbRpe?editors=0010) hat mir geholfen, es zu verstehen. Vielen Dank! –