2016-11-22 8 views
1

Я довольно счастливо тестирую асинхронные действия 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"}) 
    }) 
} 

.... но это только раз, как хорошо

ответ

0

Рассматривали ли вы с помощью промежуточного ПО для асинхронных действий? Мы используем redux-saga. Одно из самых больших преимуществ заключается в том, что генераторы легко проверяются на единицу, поскольку они просто генерируют простые объекты. См. https://github.com/yelouafi/redux-saga/blob/master/examples/counter/test/sagas.js для примера