javascript - Jest'te axios çağrısını taklit edemiyor


Görünüşe göre benim için axios üzerinden taklit etme çalışmıyor çünkü gerçek API çağrıları yapıyor gibi görünüyor (jest testi çalıştırırken 401 durum kodu aldığım için görülüyor). Neden axios'u taklit edemediğimden emin değilim. Yaptığım hatayı birisi gösterebilir mi?

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

Cevap #1

axios fonksiyonunu kullanıyorsunuz, axios.post() metodunu değil. Bu yüzden axios.post() yerine axios fonksiyonunu taklit etmelisiniz. jest.mock() bunun için doğru tercih.

Örn.

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' });
  });
});

paket sürümleri:

"axios": "^0.21.1",
"jest": "^26.6.3",

Cevap #2

Axios ile alay etmeyi düşünen herkes için, bu faydalı olabilir!

https://www.npmjs.com/package/jest-mock-axios

Sahteleme sürecini büyük ölçüde basitleştirmelidir.

İlgili makaleler