#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
. Я обновил код и тесты в своем ответе