Как смоделировать неэкспортную (приватную) функцию внутри пользовательского модуля с помощью Jest - PullRequest
0 голосов
/ 21 октября 2018

У меня есть «закрытая» функция, которая оборачивает общие функции для запроса API, и у меня есть куча «открытых» функций для запуска фактических запросов с объектом конфигурации запроса (см. Ниже в файле requestUploadStatementFile).

Я пытаюсь протестировать эти публичные функции, но я не уверен, как имитировать приватную функцию, используя Jest, в данном случае requestWithAutoTokenRenew function.

/**
 * An API wrapper which auto renew JTW once it get expired
 *
 * @param {Object} requestConfig Request configuration object
 * @returns {Promise}
 */
const requestWithAutoTokenRenew = async requestConfig => {
  const session = await doGetSession();
  const sessionToken = session.idToken.jwtToken;
  const { url, method, params, payload } = requestConfig;
  const requestObj = {
    url,
    method,
    headers: {
      Accept: "application/json",
      Authorization: sessionToken,
      "Content-Type": "application/json"
    },
    data: payload,
    ...params
  };

  return axios.request(requestObj).then(response => response.data);
};

/**
 * Upload bank or credit card statement for parsing
 *
 * @param {Object} file Statement PDF file needs to be parsed
 */
export const requestUploadStatementFile = file => {
  const requestConfig = {
    url: URL_UPLOAD,
    method: "POST",
    payload: file
  };

  return requestWithAutoTokenRenew(requestConfig);
};

1 Ответ

0 голосов
/ 21 октября 2018

Обходной путь, который я принял, заключается не в том, чтобы высмеивать всю «приватную» функцию, а только «невозможную» часть функциональности внутри «приватной» функции.В этом случае извлечение токена из удаленной службы doGetSession и вызов внешнего API с использованием метода Axios lib request.

// Mocks
import { request } from "axios";
import { doGetSession } from "../utilities/auth/auth";

// Targets
import { requestUploadStatementFile } from "./api";

jest.mock("../utilities/auth/auth");
jest.mock("axios");

describe("requestUploadStatementFile", () => {
  it("should fire request with correct reqeust configuration object", done => {
    doGetSession.mockImplementationOnce(() => {
      return Promise.resolve({ idToken: { jtwToken: "SAMPLE-TOKEN" } });
    });

    request.mockImplementationOnce(() => {
      return Promise.resolve({ data: [] });
    });

    requestUploadStatementFile({}).then(transactions => {
      const transactionsExpected = [];
      const requestExpectedArgs = {
        data: {},
        headers: { Accept: "application/json", Authorization: undefined, "Content-Type": "application/json" },
        method: "POST",
        url: "https://*.*.amazonaws.com/api/upload"
      };

      expect(transactions).toEqual(transactionsExpected);
      expect(request).toHaveBeenCalledTimes(1);
      expect(request).toHaveBeenCalledWith(requestExpectedArgs);

      done();
    });
  });
});

Спасибо за комментарий от @ felixmosh.

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

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