gpt4 book ai didi

javascript - 测试 Redux Thunk Action Creator

转载 作者:行者123 更新时间:2023-11-30 20:56:54 24 4
gpt4 key购买 nike

我有一个 redux Action 创建器,它利用 redux-thunk 执行一些逻辑来确定将什么分发到商店。它不是基于 promise 的,就像 HTTP 请求一样,所以我在如何正确测试它方面遇到了一些问题。我需要测试值何时满足条件以及何时不满足条件。由于 Action 创建者不返回 promise ,因此我无法在测试中运行 .then() 。测试此类内容的最佳方法是什么?

同样,我相信测试 getRemoveFileMetrics() Action 创建器会非常简单,因为它实际上确实返回了一个 promise 。但是,如果值为 removeFiles 并满足条件,我如何断言将调用它?怎么能写在测试里呢?

提前致谢,因为这让我在过去几天陷入困境。

Action 创作者

export const handleSelection = (value, cacheKey) => {
return dispatch => {
if (value === "removeFiles") {
dispatch(getRemoveFileMetrics(cacheKey));
}
dispatch({ type: HANDLE_SELECTION, value });
};
};

export const getRemoveFileMetrics = cacheKey => {
return dispatch => {
dispatch({ type: IS_FETCHING_DELETE_METRICS });
return axios
.get(`../GetRemoveFileMetrics`, { params: { cacheKey } })
.then(response => {
dispatch({ type: GET_REMOVE_FILE_METRICS, payload: response.data });
})
.catch(err => console.log(err));
};
};

开 Jest

it("should dispatch HANDLE_SELECTION when selecting operation", () => {
const store = mockStore({});
const value = "switchVersion";
const expectedAction = [{
type: MOA.HANDLE_SELECTION,
value,
}]; // TypeError: Cannot read property 'then' of undefined
return store.dispatch(MOA.handleSelection(value)).then(() => {
const returnedActions = store.getActions();
expect(returnedActions).toEqual(expectedAction);
});
});

新编辑

因此,根据 Danny Delott 的回复 promise ,我通过了如下测试:

export const handleSelection = (value, cacheKey) => {
return dispatch => {
if (value === "removeFiles") {
return dispatch(getRemoveFileMetrics(cacheKey));
}
return new Promise((resolve, reject) => {
resolve(dispatch({ type: HANDLE_SELECTION, value }));
});
};
};

最佳答案

是否有理由在您的操作创建者中明确不返回 promise ?看起来 getRemoveFileMetrics 正在返回 promise ,它只是在 handleSelection 中被吞没了......

最简单的解决方案是只返回 promise :

export const handleSelection = (value, cacheKey) => {
return dispatch => {
if (value === "removeFiles") {
return dispatch(getRemoveFileMetrics(cacheKey));
}
dispatch({ type: HANDLE_SELECTION, value });
return new Promise();
};
};

否则,您需要在事件循环结束后进行断言。您可以使用包装在 Promise 中的 setTimeout 来获得 .then 行为。

it("should dispatch HANDLE_SELECTION when selecting operation", () => {
const store = mockStore({});
const value = "switchVersion";
const expectedAction = [{
type: MOA.HANDLE_SELECTION,
value,
}];

store.dispatch(MOA.handleSelection(value));

// flush outstanding async tasks
return new Promise(resolve => {
setTimeout(resolve, 0);
})
.then(() => {
const returnedActions = store.getActions();
expect(returnedActions).toEqual(expectedAction);
});
});

关于javascript - 测试 Redux Thunk Action Creator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47564013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com