[レスポンス]Redux-Thunkユニットのテスト
以下のブログを参考にしました!
https://decembersoft.com/posts/how-to-unit-test-redux-thunks/
TOYプロジェクトをやることになった時に一緒にUnit Testingを練習する
公文書では、Redux ToolKitライブラリを使用してテストを説明する.まだRTKを使う準備ができていないので、勉強のためにあちこち見ています...テストのせいで、私はもう精神的に崩壊して、見えなくなったので、まず私が以前やった方法と似たような方法でテスト方法を探すことにしました.
ES6+ React Jest
まず、テストは、データベース接続、API呼び出し、非同期関数などの外部モジュールに依存することはできません.だから最初に.
依存性を探る.対応するsink関数では、
呼び出し(通常はAPI呼び出しステータス.Pending)、成功または失敗です.
私は最も速く、最も簡単で、最もよく知っている方法でやっています.関連ブログとは少し違います.Googlingにより,が成功した場合 失敗時
どのパラメータと一緒に送信するかを知る必要があるからです.
dispatchは常に監視されているため、テストに成功したり失敗したりしたときに正しい動作が呼び出されたかどうかをテストします.
Thunk関数は正常に動作することが予想される.
https://decembersoft.com/posts/how-to-unit-test-redux-thunks/
背景
TOYプロジェクトをやることになった時に一緒にUnit Testingを練習する
公文書では、Redux ToolKitライブラリを使用してテストを説明する.まだRTKを使う準備ができていないので、勉強のためにあちこち見ています...テストのせいで、私はもう精神的に崩壊して、見えなくなったので、まず私が以前やった方法と似たような方法でテスト方法を探すことにしました.
n/a.環境
に道を教える
STEP 1
依存性を探る。
const apiUrl = "http:/localhost:3001/word";
export const getWords = () => async (dispatch) => {
dispatch(getWordsAction());
try {
const res = await axios.get(apiUrl);
dispatch(getWordsSuccessAction(res.data));
} catch (error) {
dispatch(getWordsErrorAction(error));
}
};
上は簡単な形式のヤンク関数です.まず、テストは、データベース接続、API呼び出し、非同期関数などの外部モジュールに依存することはできません.だから最初に.
依存性を探る.対応するsink関数では、
axios
が非同期API呼び出しとして使用される.axios
は外部に依存するモジュールと言える.STEP 2
予想される結果を定義します。
axios
は主にREST API呼び出しに用いられ、promise
を返す関数である.axios
の結果によれば,ヤング関数の内部状態は成功(Resolve),失敗(Rejected)に分けられる.だからテストも.呼び出し(通常はAPI呼び出しステータス.Pending)、成功または失敗です.
describe("getWords Thunk함수 테스트", () => {
it("getWords Thunks함수를 호출합니다.", () => {});
describe("getWords Thunk함수가 성공 했을떄 ", () => {});
describe("getWords Thunk함수가 실패 했을때 했을떄 ", () => {});
});
STEP 3
依存モジュールをテストライブラリでカプセル化します。
私は最も速く、最も簡単で、最もよく知っている方法でやっています.関連ブログとは少し違います.Googlingにより,
axios
をシミュレートする方法を見つけ,jest.mock
はaxios
を簡単にシミュレートできるようにした.jest.mock("axios");
axiosモジュールをシミュレートした.次に、axios
モジュールが返す成功値と失敗値をシミュレートします.describe("getWords Thunk함수 테스트", () => {
it("getWords Thunks함수를 호출합니다.", () => {});
describe("getWords Thunk함수가 성공 했을떄 ", () => {
const res = {
data: [
{
word: "Korea",
meaning: "Seoul",
},
{
word: "Korea",
meaning: "Seoul",
},
{
word: "Korea",
meaning: "Seoul",
},
],
};
beforeEach(() => {
axios.get.mockResolvedValue(res);
});
});
describe("getWords Thunk함수가 실패 했을때 했을떄 ", () => {
const error = new Error("My Error");
beforeEach(() => {
axios.get.mockRejectedValue(error);
});
});
});
axios
関数がシミュレートされているため、axios
は、各テストを返す前に、戻るべき値を予め決定する.axios
データを取得します.このシェイプはjson値を予想します.axios.get.mockResolvedValue
が成功したときに返される値をシミュレートします.axios.get.mockRejectedValue
に失敗したときに返される値をシミュレートします.STEP 4
テストの作成
describe("getWords thunk test", () => {
describe("dispatch getWords", () => {
beforeEach(() => {
const data = [
{
word: "Korea",
meaning: "Seoul",
},
{
word: "Korea",
meaning: "Seoul",
},
{
word: "Korea",
meaning: "Seoul",
},
];
axios.get.mockResolvedValue(data);
});
it("dispatch getWords actions", async () => {
const dispatch = jest.fn();
await getWords()(dispatch);
expect(dispatch).toHaveBeenCalledWith(getWordsAction());
});
});
describe("dispatch getWords success", () => {
const res = {
data: [
{
word: "Korea",
meaning: "Seoul",
},
{
word: "Korea",
meaning: "Seoul",
},
{
word: "Korea",
meaning: "Seoul",
},
],
};
beforeEach(() => {
axios.get.mockResolvedValue(res);
});
it("dispatch getWords actions", async () => {
const dispatch = jest.fn();
await getWords()(dispatch);
expect(dispatch).toHaveBeenLastCalledWith(
getWordsSuccessAction(res.data)
);
});
});
describe("dispatch getWords fail", () => {
const error = new Error("My Error");
beforeEach(() => {
axios.get.mockRejectedValue(error);
});
it("dispatch getWords actions", async () => {
const dispatch = jest.fn();
await getWords()(dispatch);
expect(dispatch).toHaveBeenLastCalledWith(getWordsErrorAction(error));
});
});
});
Thunk関数では、dispatchで正しく呼び出されたアクションを決定できます.どのパラメータと一緒に送信するかを知る必要があるからです.
dispatch = jest.fn()
によってdispatch関数をシミュレーション関数に変換する.jest.fn()
の原理は、https://www.daleseo.com/jest-fn-spy-on/に関する多くのブログを参照しています.dispatchは常に監視されているため、テストに成功したり失敗したりしたときに正しい動作が呼び出されたかどうかをテストします.
Thunk関数は正常に動作することが予想される.
Reference
この問題について([レスポンス]Redux-Thunkユニットのテスト), 我々は、より多くの情報をここで見つけました https://velog.io/@wlgns2223/리액트-Redux-Thunk-유닛-테스팅하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol