【发布时间】:2018-06-18 18:16:25
【问题描述】:
我对 Jest 很陌生,而且我承认我不是测试异步代码的专家...
我使用了一个简单的Fetch 助手:
export function fetchHelper(url, opts) {
return fetch(url, options)
.then((response) => {
if (response.ok) {
return Promise.resolve(response);
}
const error = new Error(response.statusText || response.status);
error.response = response;
return Promise.reject(error);
});
}
并像这样实现它:
export function getSomeData() {
return (dispatch) => {
return fetchHelper('http://datasource.com/').then((res) => {
dispatch(setLoading(true));
return res.json();
}).then((data) => {
dispatch(setData(data));
dispatch(setLoading(false));
}).catch(() => {
dispatch(setFail());
dispatch(setLoading(false));
});
};
}
但是我想测试在正确的情况下以正确的顺序触发了正确的调度。
使用sinon.spy() 过去很容易,但我不太清楚如何在 Jest 中复制它。理想情况下,我希望我的测试看起来像这样:
expect(spy.args[0][0]).toBe({
type: SET_LOADING_STATE,
value: true,
});
expect(spy.args[1][0]).toBe({
type: SET_DATA,
value: {...},
});
提前感谢您的任何帮助或建议!
【问题讨论】:
-
redux 应该避免连续调度多个动作。您有
dispatch(setData(data)); dispatch(setLoading(false));,它将触发 2 次存储更改和 2 次渲染。如果您将其组合成一个操作,并将该操作的加载状态设置为 false,那么您的应用中将只有 1 次重新渲染。
标签: reactjs redux fetch jestjs redux-thunk