У меня есть API-сервис, где у меня есть разные методы для вызова API. Я успешно протестировал все запросы GET, но у меня возникают проблемы при тестировании запросов POST.
Это метод:
export default class ApiService {
static makeApiCall = <T>(
url: string,
oneCb: <T>(d: Data) => T,
secondCb: (d: T) => void,
errorCb?: (a: ErrorModel) => void,
method = 'get',
data = {},
): Promise<void> => {
const config: AxiosRequestConfig = {};
if (method === 'post') {
config.headers = header;
return ApiClient.post(url, data, config)
.then(res => callback(normalizeCallback(res.data))).catch(error => someHandler(error));
} else {
return ApiClient.get(url)
.then(res => callback(normalizeCallback(res.data))).catch(error => someHandler(error));
}
};
// ONLY ONE POST METHOD TO MAKE IT MORE CLEAR
static someArchiveMethod = (
callback: (a: SuccessModel) => void,
errorCallback: (error: ErrorModel) => void,
cardId: string
): Promise<void> => {
return ApiService.makeApiCall<SuccessfulResponse>(
'appreciationCard/archive',
Normalizer.successfulResponse,
callback,
errorCallback,
'post',
{ cardId }
);
};
// HERE BELOW THE GET METHODS
static getPeople = (cb: (a: PeopleModel[]) => void, page?: number, limit?: number): Promise<void> => {
const queryDetails = { page, limit };
return ApiService.makeApiCall<PeopleModel[]>(
`people?${toQueryString(queryDetails)}`,
Normalizer.normalizePeople,
callback
);
};
};
Вот как я тестирую все, что связано с GET:
describe('apiService', () => {
beforeAll(() => {
expect(ApiClient.defaults.headers.common.Authorization).toBe('Bearer test token');
// @ts-ignore
ApiClient.get.mockImplementation((url: string) => {
return Promise.resolve({ data: mockData });
});
});
it('should call api client method', () => {
ApiService.makeApiCall(
'testUrl',
data => data,
res => res,
err => err,
'get'
);
expect(ApiClient.get).toBeCalledTimes(1);
expect(ApiClient.get).toBeCalledWith('testUrl');
});
it('should call callbacks consequently', done => {
ApiService.makeApiCall('testUrl', firstCallback, secondCallback).then(() => {
expect(firstCallback).toBeCalledTimes(1);
expect(firstCallback).toBeCalledWith(mockData);
expect(secondCallback).toBeCalledTimes(1);
expect(secondCallback).toBeCalledWith(firstCallback(mockData));
done();
});
});
});
describe('api service error flow', () => {
beforeAll(() => {
// @ts-ignore
ApiClient.get.mockImplementation((url: string) => {
console.log('error result');
return Promise.reject(mockError);
});
});
it('should handle error', done => {
console.error = jest.fn();
const firstCallback = jest.fn((data: any) => data);
const secondCallback = jest.fn((data: any) => data);
ApiService.makeApiCall('testUrl', firstCallback, secondCallback).then(() => {
expect(firstCallback).toBeCalledTimes(0);
expect(secondCallback).toBeCalledTimes(0);
expect(console.error).toBeCalledTimes(1);
expect(console.error).toBeCalledWith('ApiClient testUrl', mockError);
done();
});
});
});
describe('apiService methods', () => {
beforeAll(() => {
ApiClient.get.mockImplementation((url: string) => {
expect(ApiClient.defaults.headers.common.Authorization).toBe('Bearer test token');
return Promise.resolve({ data: mockData });
});
});
it('getPeople method call with one param', () => {
ApiService.getPeople(jest.fn(), 1, 1).then(() => {
expect(ApiClient.get).toBeCalledWith('people?page=1&limit=1');
});
});
})
Я думал, что только путем изменения всех экземпляров ApiClient.get
на ApiClient.post
него будет работать для проверки запросов POST. Но когда я пытаюсь это сделать, это говорит об этом can not read mockImplementation of undefined
. Я пытался изменить методы в тестах, чтобы использовать post
параметр, чтобы перезаписать параметр, method = 'get'
но у меня ничего не получилось, я получаю эту ошибку
Ошибка типа: apiClient_1.default.post не является функцией
Какие-нибудь мысли?
javascript
reactjs
testing
ecmascript-6
jestjs
Реагируя
источник
источник
ApiClient
нет методаpost
.return ApiClient.post(url, data, config) .then(res => callback(normalizeCallback(res.data))).catch(error => someHandler(error));
и она работает правильно, когда я пытаюсь сделать запрос на публикацию. Я имею в виду, что у меня как 17 сообщений запросов работает, как они должны. Так почему же в тестах не работают тогда?get
тесте, но я изменил все экземплярыget
иpost
вместо этого установил .Ответы:
Я исследовал вашу проблему. Прежде всего, я хочу сказать, что у вашего кода есть пара проблем, таких как обратный вызов, который вы не определили, неясное определение
ApiClient
и т. Д.Итак, я создал пример Repl, чтобы воспроизвести вашу проблему, в которой я немного упростил ваш код, но все основные элементы есть.
Пожалуйста, посмотрите https://repl.it/@SergeyMell/Some-Jesting
Она успешно работает как
get
иpost
методы без проблем. Вот основные моменты, на которые стоит обратить внимание:axios
какApiClient
. (Из твоего вопроса не было понятно, поэтому я предположил, что это так)axios
(Предположим, вы делаете то же самое)Помещение насмешек обоим
get
иpost
запросам аналогичным образом (по-вашему)Поэтому, пожалуйста, проверьте мой пример, проверьте различия с вашим кодом и дайте мне знать о дополнительной детализации, которая может вам понадобиться.
источник
Пожалуйста, попробуйте изменить
mockImplementation
наmockImplementationOnce
источник