javascript - ไม่สามารถจำลองการเรียก axios ใน Jest ได้
ดูเหมือนว่าการทำ mocking ไม่ได้ผลสำหรับผมผ่าน axios เพราะดูเหมือนว่ามันกำลังเรียก API จริง (เห็นได้ชัดเพราะผมได้รับสถานะ 401 เมื่อรันการทดสอบ jest) ผมไม่แน่ใจว่าทำไมผมถึงไม่สามารถ mock axios ได้ มีใครสามารถบอกข้อผิดพลาดที่ผมทำได้ไหม?
index.test.ts
describe("compositeScore()", () => {
it("Mock Fetch API for Composite Score Response", async () => {
const mock = jest.spyOn(axios, "post");
mock.mockReturnValueOnce(mockResponse);
const response = await dateFilter(platform);
expect(mock).toHaveBeenCalledTimes(1);
expect(response).toEqual(mockFetchCompositeScoreResponse);
});
});
index.ts
export const dateFilters = async (platform) => {
const dates = await fetchWrapper(
platform.toLowerCase().concat("DateFilters"),
platform,
{}
);
return dates;
};
export async function fetchWrapper(
queryName: string,
platform: string,
queryParams?: {}
) {
const headers = {
Accept: "application/json",
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
};
const config: AxiosRequestConfig = {
method: "post",
url,
headers,
data: {
db: dbName,
csl: queryParams
? substituteQueryParameters(queries[queryName], queryParams)
: queries[queryName],
},
};
return axios(config);
}
คำตอบ #1
คุณกำลังใช้ฟังก์ชัน axios ไม่ใช่เมธอด axios.post() ดังนั้นคุณควรจำลองฟังก์ชัน axios แทนที่จะเป็น axios.post() การใช้ jest.mock() เป็นตัวเลือก
เช่น
index.ts:
import axios, { AxiosRequestConfig } from 'axios';
export const dateFilters = async (platform) => {
const dates = await fetchWrapper(platform.toLowerCase().concat('DateFilters'), platform, {});
return dates;
};
export async function fetchWrapper(queryName: string, platform: string, queryParams?: {}) {
const token = '123';
const url = 'http://localhost:3000/api';
const dbName = 'test';
const headers = {
Accept: 'application/json',
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
};
const config: AxiosRequestConfig = {
method: 'post',
url,
headers,
data: {
db: dbName,
},
};
return axios(config);
}
index.test.ts:
import axios, { AxiosResponse } from 'axios';
import { dateFilters } from '.';
jest.mock('axios');
const mAxios = axios as jest.MockedFunction<typeof axios>;
describe('71351319', () => {
it('Mock Fetch API for Composite Score Response', async () => {
const mockResponse = { data: {}, status: 200, statusText: 'ok' } as AxiosResponse;
mAxios.mockResolvedValue(mockResponse);
const response = await dateFilters('DateFilters');
expect(mAxios).toHaveBeenCalledTimes(1);
expect(response).toEqual({ data: {}, status: 200, statusText: 'ok' });
});
});
เวอร์ชันของแพ็กเกจ:
"axios": "^0.21.1",
"jest": "^26.6.3",
คำตอบ #2
สำหรับใครก็ตามที่กำลังมองหาวิธีล้อเลียน Axios สิ่งนี้อาจช่วยได้!
https://www.npmjs.com/package/jest-mock-axios
มันควรทำให้กระบวนการล้อเลียนง่ายขึ้นอย่างมาก
