Как разрешить promise и шпионить за функцией внутри axios

#javascript #promise #jestjs #axios-mock-adapter

#javascript #обещание #jestjs #axios-макет адаптера

Вопрос:

 function getusers(config){
     const {successCB} = config;
     return axios.get(url, params)
      .then(response => {
        successCB(response.data, config);
      });
}

************************ UT ******************************

const mock = new MockAdapter(axios);
const successCB = jest.fn();

mock.onGet(url).reply(200, 'success');
const axiosSpy = jest.spyOn(axios, 'get');
const successCBSpy = jest.spyOn(config, 'successCB');

getUsers({successCB});
  

axiosSpy — это успех из приведенного ниже кода

 expect(axiosSpy).toHaveBeenCalled();
  

Но это не проникает внутрь, чтобы разрешить с результатами для successCB

 expect(successCBSpy).toHaveBeenCalled();
  

Выдает ошибку как: successCB никогда не вызывался

Что я делаю не так и чего мне следует ожидать здесь?

Я могу использовать только решения ES6.

Ответ №1:

Убедитесь, что вы вернули Promise from getusers , чтобы вы могли await использовать его в своем тесте.

Вот полный рабочий пример:

 const axios = require('axios');
const MockAdapter = require('axios-mock-adapter');

const url = 'test-url';
const params = {};

function getusers(config) {
  const { successCB } = config;
  return axios.get(url, params)  // <= return the Promise
    .then(response => {
      successCB(response.data, config);
    });
}

test('getusers', async () => {  // <= async test function
  const mock = new MockAdapter(axios);
  const successCB = jest.fn();

  mock.onGet(url).reply(200, 'success');
  const axiosSpy = jest.spyOn(axios, 'get');

  await getusers({ successCB });  // <= await the Promise

  expect(axiosSpy).toHaveBeenCalled();  // Success!
  expect(successCB.mock.calls[0][0]).toBe('success');  // Success!
})
  

Обновить

Если async/await синтаксис не подходит, вы можете выполнить утверждения в then обратном вызове и вернуть результат Promise теста, чтобы Jest знать, что его нужно дождаться:

 test('getusers', () => {
  const mock = new MockAdapter(axios);
  const successCB = jest.fn();

  mock.onGet(url).reply(200, 'success');
  const axiosSpy = jest.spyOn(axios, 'get');

  return getusers({ successCB }).then(() => {
    expect(axiosSpy).toHaveBeenCalled();  // Success!
    expect(successCB.mock.calls[0][0]).toBe('success');  // Success!
  });
})
  

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

1. @Mithun Я просто изложил общую идею того, что вам нужно сделать. Если вы обновите свой вопрос своим реальным тестовым кодом, я обновлю свой ответ на основе кода, которым вы делитесь

2. @Mithun Я обновил свой ответ полным рабочим примером

3. @Mithun Я добавил пример для тестирования без использования async/await синтаксиса

4. @Mithun Я просто добавляю эти комментарии как способ указать, что тест пройден, но, конечно, я могу их удалить

5. @Mithun а, теперь я понял, о чем ты спрашиваешь. Удалить config в качестве второго аргумента successCB в getusers . Я обновил код и тесты в своем ответе