Javascript 测试Redux Thunk操作创建者
我有一个redux操作创建者,它利用redux thunk执行一些逻辑来确定要发送到商店的内容。它不像HTTP请求那样基于承诺,因此我在如何正确测试它方面遇到了一些问题。我需要测试该值何时满足条件,何时不满足条件。由于action creator没有返回承诺,因此我无法在测试中运行.then()。测试这种东西的最好方法是什么 同样,我相信测试getRemoveFileMetrics()操作创建者会非常简单,因为它实际上返回了一个承诺。但是,如果值为removeFiles且满足条件,我如何断言将调用该函数?这怎么能写在测试中呢 提前感谢,因为这让我在过去的几天里一直处于困境 动作创作者Javascript 测试Redux Thunk操作创建者,javascript,unit-testing,redux,jestjs,redux-mock-store,Javascript,Unit Testing,Redux,Jestjs,Redux Mock Store,我有一个redux操作创建者,它利用redux thunk执行一些逻辑来确定要发送到商店的内容。它不像HTTP请求那样基于承诺,因此我在如何正确测试它方面遇到了一些问题。我需要测试该值何时满足条件,何时不满足条件。由于action creator没有返回承诺,因此我无法在测试中运行.then()。测试这种东西的最好方法是什么 同样,我相信测试getRemoveFileMetrics()操作创建者会非常简单,因为它实际上返回了一个承诺。但是,如果值为removeFiles且满足条件,我如何断言将调
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));
};
};
开玩笑
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)回复承诺的回答,我通过了如下测试:
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 }));
});
};
};
是否有理由在你的行动中明确不返回承诺?看起来
getRemoveFileMetrics
正在返回承诺,它只是被handleSelection
吞没了
最简单的解决办法是回报承诺:
export const handleSelection = (value, cacheKey) => {
return dispatch => {
if (value === "removeFiles") {
return dispatch(getRemoveFileMetrics(cacheKey));
}
dispatch({ type: HANDLE_SELECTION, value });
return new Promise();
};
};
否则,您需要在事件循环完成后进行断言。您可以使用包装在承诺中的setTimeout来获得。然后执行行为
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);
});
});
所以我想我找到了一个修复,检查我的新编辑上面,它似乎符合断言。