笑话模拟函数未调用模拟axios实例函数(返回未定义)

时间:2020-10-26 13:35:32

标签: javascript typescript unit-testing axios jestjs

我首先关注this StackOverflow Question

中的答案

但是我添加了一个辅助函数,该函数使用与用户相关联的身份验证令牌创建了一个新的Axios实例。

看起来像这样:

ModelName.query(
  index_name: 'display-index',
  expression_attribute_names: { "#display_name" => "display" },
  expression_attribute_values: { ":display_value" => "das" },
  key_condition_expression: "#display_name = :display_value",
)

mockAxios.create()为什么返回未定义?

同时定义了对象“ mockAxios”(和创建函数)。当我实际调用create时,尽管已声明该函数,但它仍返回未定义的值。

我知道我可以通过只返回对ockAxios来回避问题,但是我想理解为什么它首先不起作用。我希望返回一个新实例,该实例与嘲笑Axios相同,只是返回未定义。

1 个答案:

答案 0 :(得分:1)

如果要创建自动模拟(在__mocks__内),则意味着要模拟该模块,并且不应在该模块内放置任何辅助功能,但可能会将其包含在代码中的其他位置< / p>

例如:

src/axios.utils.ts (导出axios和功能的实用程序模块)
import axios from "axios";

export const createAuthenticatedInstance = (
  ...args: Parameters<typeof axios.create>
) => {
  return axios.create(...args);
};

export default axios;
src/__mocks__/axios.ts (Axios模拟)
const axios: jest.Mocked<typeof import("axios").default> = jest.createMockFromModule(
  "axios"
);

axios.create.mockReturnThis();

export default axios;
src/api.ts (使用axios.util的api实现)

import axios from "axios";
import { createAuthenticatedInstance } from "./axios.utils";

const client = createAuthenticatedInstance({
  baseURL: "http://example.com:80/main",
});

export default {
  makeSomeReq: () => client.get<string>("/path"),
};
src/api.spec.ts (测试)

import api from "./api";
import axios, { AxiosResponse } from "axios";

jest.mock("axios");

const { get } = axios as jest.Mocked<typeof import("axios").default>;

describe("api", () => {
    it("should have created an axios instance", () => {
      expect(axios.create).toHaveBeenCalledWith({
        baseURL: "http://example.com:80/main",
      });
    });
})

working example