如何使用 Jest 模拟用户模块内的取消导出(私有)函数



我有一个"私有"函数,它包装了API请求的通用功能,我有一堆"公共"函数来触发带有请求配置对象的实际请求(见下文requestUploadStatementFile文件(。

我正在尝试测试这些公共函数,但我不确定如何使用 Jest 模拟私有函数,在这种情况下,requestWithAutoTokenRenew函数。

/**
* 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);
};

我采用的解决方法不是模拟整个"私有"功能,而只是嘲笑"私有"函数中功能的"不可能"部分。在这种情况下,从远程服务获取令牌doGetSession并使用 Axios librequest方法调用外部 API。

// 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

最新更新