Какое промежуточное ПО Redux вы используете для асинхронных операций?Убедитесь, что вы установили промежуточное программное обеспечение при создании хранилища для тестирования.
Поскольку я не вижу, чтобы в вашем коде выше я предполагал, что мы не используем это промежуточное программное обеспечение здесь.
Поскольку loadAllProjectsфункция более высокого порядка, я бы сделал это:
it('should create SET_ALL_PROJECTS action when fetching projects', (done) => {
fetch
.once(JSON.stringify([{ access_token: "12345" }]))
.once(JSON.stringify({ name: "x" }))
const expectedActions = [
{ type: "SET_ALL_PROJECTS", json: { name: "x" } },
]
// Higher order function that returns a new function.
const loadAllProjectsAsync = actions.loadAllProjects();
// The function returned expects a dispatch from Redux as an argument.
// It will do async work and when its done, it will call the provided dispatch.
loadAllProjectsAsync(store.dispatch).then(() => {
expect(store.getActions()).toEqual(expectedActions);
done();
})
});
Вам также нужно изменить свой код для loadAllProjects, чтобы внутренняя функция возвращала обещание:
export const loadAllProjects = () => {
return (dispatch) => {
// You will need to return the promise in order for the test to be able to call .then() on it.
return getHeadersWithToken()
.then(applicationJsonHeaders => {
const requestOptions = {
method: 'GET',
headers: applicationJsonHeaders,
};
return fetch(process.env.REACT_APP_PROJECTS_API_URL + "/projects", requestOptions)
.then(parseResponseAndHandleErrors)
.then(json => {
dispatch(setAllProjects(json))})
.catch(error => {
console.error(error)
dispatch(failedToLoadProjects(error))
});
})
}}
Кроме того, как уже было сказаноВы должны сообщить шутку, когда тест завершен, если вы тестируете асинхронный материал.Сделайте это, позволив своему вызову it принять done
в качестве параметра и вызвать его в качестве функции после того, как вы проверили результат в .then ()
Это было просто быстрое решение с моей стороны.Там может быть что-то, чего я пропускаю или какие-то ошибки в приведенном выше коде, но вы понимаете, в чем дело.
Дайте мне знать, если у вас есть дополнительные вопросы?