タイトルの質問を考えるのが下手で、すみません。
私の問題:
docs で提案されているように、非同期の redux アクションを単体テストしています。で API 呼び出しをモックしnock、ディスパッチされたアクションを でチェックしredux-mock-storeます。これまでのところうまく機能していますが、明らかに機能しているにもかかわらず失敗するテストが 1 つあります。ディスパッチされたアクションは、 によって返される配列に表示されstore.getActions()ず、 で状態が変更されませんstore.getState()。手動でテストしてRedux Dev Toolsで観察するとわかるので、それが起こると確信しています。
このアクション ディスパッチで唯一異なる点は、別のプロミスのキャッチ内のプロミスで呼び出されることです。(混乱するように聞こえるかもしれませんが、コードを見てください!)
私のコードは次のようになります。
アクション:
export const login = (email, password) => {
return dispatch => {
dispatch(requestSession());
return httpPost(sessionUrl, {
session: {
email,
password
}
})
.then(data => {
dispatch(setUser(data.user));
dispatch(push('/admin'));
})
.catch(error => {
error.response.json()
.then(data => {
dispatch(setError(data.error))
})
});
};
}
このhttpPostメソッドは、ステータス コードが 200 ~ 299 の範囲にない場合にスローする単なるラッパーでfetchあり、失敗しない場合は json をオブジェクトに解析します。関連性があると思われる場合はここに追加できますが、これを長くしたくありません。
表示されないアクションはdispatch(setError(data.error)).
テスト:
it('should create a SET_SESSION_ERROR action', () => {
nock(/example\.com/)
.post(sessionPath, {
session: {
email: fakeUser.email,
password: ''
}
})
.reply(422, {
error: "Invalid email or password"
})
const store = mockStore({
session: {
isFetching: false,
user: null,
error: null
}
});
return store.dispatch(actions.login(
fakeUser.email,
""))
.then(() => {
expect(store.getActions()).toInclude({
type: 'SET_SESSION_ERROR',
error: 'Invalid email or password'
})
})
});
読んでくれてありがとう。
編集:
setErrorアクション:
const setError = (error) => ({
type: 'SET_SESSION_ERROR',
error,
});
httpPostメソッド:
export const httpPost = (url, data) => (
fetch(url, {
method: 'POST',
headers: createHeaders(),
body: JSON.stringify(data),
})
.then(checkStatus)
.then(response => response.json())
);
const checkStatus = (response) => {
if (response.status >= 200 && response.status < 300) {
return response;
}
const error = new Error(response.statusText);
error.response = response;
throw error;
};