Как протестировать Redux Thunk Async Action с помощью модуля Jest Mock - PullRequest
0 голосов
/ 16 сентября 2018

Фрагмент кода ниже - это мои транзакции. Я могу использовать __mocks__, чтобы высмеивать функцию doFetchTransactions, но она охватывает только счастливый случай didFetchTransactionsSuccessful. Как сделать так, чтобы это также покрывало неудачный случай?

import { doFetchTransactions as networkFetchTransactions } from "../../utilities/api";

export const ACTION_TYPE = {
  FETCH_TRANSACTIONS_SUCCESS: "FETCH_TRANSACTIONS_SUCCESS",
  FETCH_TRANSACTIONS_FAILED: "FETCH_TRANSACTIONS_FAILED"
};

export const doFetchTransactions = () => {
  return dispatch => {
    const handleReslove = response => {
      const transactions = response;

      dispatch(didFetchTransactionsSuccessful(transactions));
    };

    const handleReject = error => {
      dispatch(didFetchTransactionsFailed());
    };

    return networkFetchTransactions(handleReslove, handleReject);
  };
};

const didFetchTransactionsSuccessful = transactions => {
  return {
    type: ACTION_TYPE.FETCH_TRANSACTIONS_SUCCESS,
    transactions
  };
};

const didFetchTransactionsFailed = () => {
  return {
    type: ACTION_TYPE.FETCH_TRANSACTIONS_FAILED
  };
};

То, что я пытаюсь сделать, но не удалось (я думаю, это вызвано require зависимостью от загрузки только один раз),

import { mockStore } from "../store/mockStore";

describe("Actions for Transactions", () => {
  beforeEach(() => {
    jest.clearAllMocks();
  });

  it("should create correct action when transaction fetching success", async () => {
    const mockApiFunctions = () => ({
      doFetchTransactions: jest.fn(handleSuccess => handleSuccess([]))
    });

    jest.mock("../../utilities/api", () => mockApiFunctions());

    const { doFetchTransactions } = require("./transactions");
    const store = mockStore();
    await store.dispatch(doFetchTransactions());
    const actions = store.getActions();

    expect(actions).toEqual([{ transactions: [], type: "FETCH_TRANSACTIONS_SUCCESS" }]);
  });

  it("should create correct action when transaction fetching failed", async () => {
    const mockApiFunctions = () => ({
      doFetchTransactions: jest.fn((_, handleReject) => handleReject("Error"))
    });

    jest.mock("../../utilities/api", () => mockApiFunctions());
    const { doFetchTransactions } = require("./transactions");
    const store = mockStore();
    await store.dispatch(doFetchTransactions());
    const actions = store.getActions();
    expect(actions).toEqual([]);
  });
});

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Я широко использовал redux-mock-store https://github.com/dmitry-zaets/redux-mock-store для тестирования создателей синхронных и асинхронных действий

0 голосов
/ 16 сентября 2018
jest.resetModules();

Может решить проблему повторного импорта модуля.

Сбрасывает реестр модулей - кэш всех необходимых модулей.Это полезно для изоляции модулей, где локальное состояние может конфликтовать между тестами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...