用笑话测试 axios.create() 实例
Testing axios.create() instance with jest
我从这个任务中尝试了很多解决方案。我想在没有任何库(jest-axios-mock、moaxios、msw 等)的情况下测试 axios 实例 api 调用。我希望这是可能的,因为我成功地测试了简单的 axios 调用( axios.get / axios.post 没有 .create )
主要问题是我尝试测试 axios 实例调用,我在不同的尝试中遇到了三个主要错误。
1 axios_instance_1.axiosInstance 不是函数
2 无法读取未定义的 属性 'then'
3 无法读取未定义的 属性 'post'
当我尝试绕过模块 mock ( jestjs.io/docs/bypassing-module-mocks ) 时我得到了这个
我最后一次尝试是这样的
axios-instance.ts
import axios from "axios";
export const axiosInstance = axios.create({
headers: {'X-Custom-Header': 'foobar'}
})
api.ts
import { axiosInstance } from "../instancec/axios-instance";
export const axiosInstanceCounter = () => {
return axiosInstance({
method: 'post'
}).then((data) => {
console.log(data)
})
}
axios.test.ts
import { axiosInstanceCounter } from '../features/api/axiosTest';
import { axiosInstance } from '../features/instancec/axios-instance';
import axios, { AxiosResponse } from 'axios';
jest.mock('../features/instancec/axios-instance', () => ({
const instance = {
create: jest.fn(),
};
return jest.fn(() => instance);
}));
it('Axios instance standart test', async () => {
(axiosInstance.post as jest.Mock).mockResolvedValueOnce(() =>
Promise.resolve(),
);
await axiosInstanceCounter();
expect(axiosInstance).toBeCalledTimes(1);
});
我收到的最后一个错误是无法读取未定义 的'post'。在文件夹 mocks 中创建模拟文件并从那里导出也无济于事。
我不太明白为什么会这样,我将非常感谢任何提示,我也尝试了 jest.spyOn 选项,但失败了。
解决方案的补充
我用 ts-jest 替换了 mocked() 以避免警告
const mockedAxiosInstance = axiosInstance as jest.MockedFunction<
typeof axiosInstance
>;
如你所见,return axiosInstance({
意味着axiosInstance
是一个函数,那么如果你想测试axiosInstanceCounter
函数,只需将axiosInstance
模拟为一个普通函数(在你的情况下,api 调用不会 return 任何东西):
api.test.ts // 测试 api.ts
import { AxiosPromise } from "axios";
import { mocked } from "ts-jest/utils"; // a helper function from ts-jest
import { axiosInstanceCounter } from '../features/api/axiosTest'; // should be ../features/api ???
import { axiosInstance } from '../features/instancec/axios-instance';
jest.mock("../features/instancec/axios-instance");
describe("api", () => {
describe("axiosInstanceCounter()", () => {
it("should call api with correct parameters", async () => {
// mock to resolve a Promise<void>
mocked(axiosInstance).mockResolvedValue(Promise.resolve() as unknown as AxiosPromise<void>);
await axiosInstanceCounter();
expect(axiosInstance).toHaveBeenCalledWith({ method: "post" });
});
});
});
这也有效,而且对您的目的来说更简单
import { axiosInstanceCounter } from "../features/api/axiosTest";
import { axiosInstance } from "../features/instancec/axios-instance";
let apiSpy;
describe("getPokemonOptions", () => {
beforeEach(() => {
jest.clearAllMocks();
});
it("Axios instance standart test", async () => {
apiSpy = jest.spyOn(axiosInstance, "post");
apiSpy.mockResolvedValue({});
await axiosInstanceCounter();
expect(axiosInstance).toBeCalledTimes(1);
});
});
我从这个任务中尝试了很多解决方案。我想在没有任何库(jest-axios-mock、moaxios、msw 等)的情况下测试 axios 实例 api 调用。我希望这是可能的,因为我成功地测试了简单的 axios 调用( axios.get / axios.post 没有 .create ) 主要问题是我尝试测试 axios 实例调用,我在不同的尝试中遇到了三个主要错误。
1 axios_instance_1.axiosInstance 不是函数
2 无法读取未定义的 属性 'then'
3 无法读取未定义的 属性 'post'
当我尝试绕过模块 mock ( jestjs.io/docs/bypassing-module-mocks ) 时我得到了这个
我最后一次尝试是这样的
axios-instance.ts
import axios from "axios";
export const axiosInstance = axios.create({
headers: {'X-Custom-Header': 'foobar'}
})
api.ts
import { axiosInstance } from "../instancec/axios-instance";
export const axiosInstanceCounter = () => {
return axiosInstance({
method: 'post'
}).then((data) => {
console.log(data)
})
}
axios.test.ts
import { axiosInstanceCounter } from '../features/api/axiosTest';
import { axiosInstance } from '../features/instancec/axios-instance';
import axios, { AxiosResponse } from 'axios';
jest.mock('../features/instancec/axios-instance', () => ({
const instance = {
create: jest.fn(),
};
return jest.fn(() => instance);
}));
it('Axios instance standart test', async () => {
(axiosInstance.post as jest.Mock).mockResolvedValueOnce(() =>
Promise.resolve(),
);
await axiosInstanceCounter();
expect(axiosInstance).toBeCalledTimes(1);
});
我收到的最后一个错误是无法读取未定义 的'post'。在文件夹 mocks 中创建模拟文件并从那里导出也无济于事。 我不太明白为什么会这样,我将非常感谢任何提示,我也尝试了 jest.spyOn 选项,但失败了。
解决方案的补充
我用 ts-jest 替换了 mocked() 以避免警告
const mockedAxiosInstance = axiosInstance as jest.MockedFunction<
typeof axiosInstance
>;
如你所见,return axiosInstance({
意味着axiosInstance
是一个函数,那么如果你想测试axiosInstanceCounter
函数,只需将axiosInstance
模拟为一个普通函数(在你的情况下,api 调用不会 return 任何东西):
api.test.ts // 测试 api.ts
import { AxiosPromise } from "axios";
import { mocked } from "ts-jest/utils"; // a helper function from ts-jest
import { axiosInstanceCounter } from '../features/api/axiosTest'; // should be ../features/api ???
import { axiosInstance } from '../features/instancec/axios-instance';
jest.mock("../features/instancec/axios-instance");
describe("api", () => {
describe("axiosInstanceCounter()", () => {
it("should call api with correct parameters", async () => {
// mock to resolve a Promise<void>
mocked(axiosInstance).mockResolvedValue(Promise.resolve() as unknown as AxiosPromise<void>);
await axiosInstanceCounter();
expect(axiosInstance).toHaveBeenCalledWith({ method: "post" });
});
});
});
这也有效,而且对您的目的来说更简单
import { axiosInstanceCounter } from "../features/api/axiosTest";
import { axiosInstance } from "../features/instancec/axios-instance";
let apiSpy;
describe("getPokemonOptions", () => {
beforeEach(() => {
jest.clearAllMocks();
});
it("Axios instance standart test", async () => {
apiSpy = jest.spyOn(axiosInstance, "post");
apiSpy.mockResolvedValue({});
await axiosInstanceCounter();
expect(axiosInstance).toBeCalledTimes(1);
});
});