Как протестировать асинхронную функцию с обратным вызовом в шутку?

#javascript #reactjs #unit-testing #jestjs #enzyme

#javascript #reactjs #модульное тестирование #jestjs #фермент

Вопрос:

Мне трудно найти информацию о том, как протестировать эту функцию:

 const MyService = {
  async stringify (entry, cb) {
    try {
      const response = await axios.post('localhost:3005/stringify', {
        entry
      })
      
      cb(null, response.data)

    } catch (minificationError) {

      if (minificationError.response.status === 500) {
        cb('error 1', null)
      } else {
        cb('error 2', null)
      }

    }
  }
}
  

Я понимаю, что могу импортировать axios и издеваться над .post этим:

 axios.post.mockResolvedValue({
   data: { some: 'value' }
})
  

Это было бы здорово, если бы MyService возвращал обещание… но как мне справиться с обратным вызовом? Является ли это плохой практикой и должна ли служба возвращать обещание, а затем обрабатывать ошибки в функциях компонента вместо этого?

Кроме того, как бы я издевался над кодом состояния с помощью jest (для проверки состояний сбоя?)

Комментарии:

1. Является ли это плохой практикой и должна ли служба возвращать обещание, а затем обрабатывать ошибки в функциях компонента вместо этого? — определенно.

Ответ №1:

Сначала вам нужно настроить макет axios, после чего вы должны вызвать свой mockapi в своем тестовом примере

 const axios = {
  post: jest.fn(() => {
    return Promise.resolve({
      data: {},
    });
  }),

  create: () => axios,
  request: {},
  defaults: {
    adapter: {},
    headers: {},
  },
  interceptors: {
    request: {
      use() {},
    },
    response: {
      use() {},
    },
  },
};
  

После того, как вы настроите макет axios, вы сможете получить доступ к своему тестовому варианту и вернуть любой макет ответа и код состояния, который вы хотите.

 mockAxios.post.mockImplementation((url) => {
  if (url.includes("something")) {
    return Promise.resolve({ data:{"response":""}, status: 200 });
  } 
  return Promise.reject(new Error("not found"));
});
  

Комментарии:

1. Спасибо. Чем определение axios отличается от использования jest.mock("axios") ?