Как издеваться над перехватчиками при использовании jest.mock ('ax ios')? - PullRequest
1 голос
/ 26 февраля 2020

При выполнении теста с использованием jest у меня есть базовый c синтаксис тестового набора:

jest.mock('axios');

describe('app', () => {
    let render

    beforeEach(() => {
        axiosMock.get.mockResolvedValueOnce({
            data: {greeting: 'hello there'},
        }),
        render= renderApp()
    });

    test('should render something', () => {
        expect(something).toBeInTheDocument();
    });


});

Проблема в том, что в моем коде есть перехватчики, которые при запуске теста с командой jest выводят:

TypeError: Невозможно прочитать свойство 'перехватчики' из неопределенного

и указывает на объект перехватчиков

axiosInstance.interceptors.request.use(...

axiosInstance - это переменная, хранящая возврат axios.create

export const axiosInstance = axios.create({...

Относится к этому топору ios Резьба на SO Как проверить топор ios в шутку , но не требует перехватчиков, поэтому на самом деле не помогло.

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Убедитесь, что макет перехватчиков и axios.create, если используется:

// Replace any instances with the mocked instance (a new mock could be used here instead):
axios.create.mockImplementation((config) => axios);

// Mock out the interceptor (assuming there is only one):
let requestCallback = () => {
  console.log("There were no interceptors");
};
axios.interceptors.request.use.mockImplementation((callback) => {
  requestCallback = callback;
});

// Mock out the get request so that it returns the mocked data but also calls the 
// interceptor code:
axios.get.mockImplementation(() => {
  requestCallback();
  return {
    data: "this is some data"
  };
});

Примечание , если это не работает:

В этом примере предполагается, что вызовы create и interceptor находятся в месте, где Jest может их высмеивать. Размещение строк axios.create или axiosInstance.interceptors.request.use вне области действия функции может привести к сбою вышеупомянутой насмешки. Это пример файла, в котором Jest может имитировать их:

const axios = require('axios');

const DEBUG = true;

const customRequest = (url) => {
  // Example of axios.create from https://www.npmjs.com/package/axios#axioscreateconfig
  const axiosInstance = axios.create({
    baseURL: 'https://some-domain.com/api/',
    timeout: 1000,
    headers: {'X-Custom-Header': 'foobar'}
  });

  // Example of interceptor taken from https://stackoverflow.com/a/52737325/7470360:
  axiosInstance.interceptors.request.use((config) => {
    if (DEBUG) { console.info("Request called", config); }
    return config;
  }, (error) => {
    if (DEBUG) { console.error("Request error ", error); }
    return Promise.reject(error);
  });

  return axiosInstance.get(url);
}

module.exports = customRequest;

Код насмешки будет имитировать вызовы axios.create и axiosInstance в customRequest. Перемещение создания или перехвата за пределы функции приведет к сбою макетов.

0 голосов
/ 27 февраля 2020

В конце концов этого было достаточно

jest.mock('axios', () => {
    return {
        interceptors: {
            request: { use: jest.fn(), eject: jest.fn() },
            response: { use: jest.fn(), eject: jest.fn() },
        },
    };
});
...