Я довольно счастливо тестирую асинхронные действия Redux, но я полностью потрясен одной довольно простой ситуацией. Вот моя функция:Тестирование асинхронного действия Redux с fetch-макетом и преобразование в json
//actions.js
export const fetchInfo = (credentials) => {
return (dispatch) => {
dispatch(asyncRequest())
const fetchConfig = {
method: 'POST',
body: JSON.stringify({
email: credentials.email,
token: credentials.token
})
}
return fetch('api/info', fetchConfig)
.then(response => {
if (response.status === 200) {
return response.json()
.then((json) => {
console.log(json)
dispatch(receiveInfoSuccess(json))
} else if (response.status === 401) {
dispatch(push('/signin'))
},
error => {
dispatch(receiveInfoFailure(error))
})
}
}
Если я проверить свой статус 401 случая, все нормально, но по некоторым причинам я не могу получить тест пробежать мимо response.json()
. Вот мой тест:
it('should use fetchInfo to dispatch relevant action creators', (done) => {
const credentials = {"email": "[email protected]", "token": "djbsdJ"}
const fetchReturnVal = {
status: 200,
headers: {"Content-Type": "application/json"},
body: {
"id": "kjbsdf"
}
}
fetchMock.post('api/info', fetchReturnVal)
const expectedActions = [
{type: 'ASYNC_REQUEST'},
{type: 'RECEIVE_INFO_SUCCESS',
payload: {
id: 'kjbsdf'
}
}
]
function mockDispatch(action) {
const expectedAction = expectedActions.shift()
expect(action).toEqual(expectedAction)
if (!expectedActions.length) {
done()
}
}
actions.fetchLogin(credentials)(mockDispatch)
})
Испытание всегда раз с Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
и код никогда не впадает в .then
блок.
Как я могу получить обещание response.json
? Я пытался что-то вроде включая следующий ключ выборки возвращаемого значения:
json:() => {
return new Promise((resolve, reject) => {
resolve({"id": "example"})
})
}
.... но это только раз, как хорошо