У меня есть рабочий процесс сохранения в моем приложении «Реакция / сокращение», для которого требуется два вызова API. Второй вызов происходит только после успешного завершения первого вызова. Приложение работает великолепно, и я добавляю некоторое автоматизированное сквозное тестирование.
Я могу вызвать функцию onSave
и подтвердить вызов на saveRates
, но у меня возникают проблемы с запуском второго вызова API в моих тестах. Вот код
function onSave() {
// PUT to /rates/<id>
dispatchProps.saveRates()
.then(() => {
// PUT to /apps/<id>
dispatchProps.saveApplications()
.then(() => {
// Done
});
});
}
И это тестовый код. Я использую Axios для вызовов API в приложении и jest-mock-axios
, чтобы смоделировать axios в моих тестах.
// At this point, `onSave` has been called
// This test passes
expect(mockAxios.put).toHaveBeenCalledWith(`rates/${rateId}`, { rate: { id: rateId }});
mockAxios.mockResponse({ status: 200 }, mockAxios.lastReqGet());
// This test fails with the error indicating that the expected API call was actually `PUT rates/<id>`
expect(mockAxios.put).toHaveBeenCalledWith(`app/${appId}`, { app: { id: appId, rate: rateId }});
mockAxios.mockResponse({ status: 200 }, mockAxios.lastReqGet());
Кажется, что обещание от первого вызова API, saveRates
не было выполнено. Вызов mockResponse
разрешает обещание, но, используя jest-отладчик, я вижу, что вызов saveApplications
никогда не происходит.
https://www.npmjs.com/package/jest-mock-axios#axiosmockresponseresponse-requestinfo
Как мне сказать jest подождать, пока не произойдет следующий вызов API? Нужно ли мне возвращать обещания из onSave
звонка?
UPDATE
Это работает ... поэтому я подозреваю, что это можно решить с помощью await
где-то.
expect(mockAxios.put).toHaveBeenCalledWith(`taxes/event/${window.storeAdminTaxEventUuid}/rates/customer`, taxRatesResponse.data.customer);
mockAxios.mockResponse({ status: 200 }, mockAxios.lastPromiseGet());
setTimeout(() => {
expect(mockAxios.put).toHaveBeenCalledWith(`taxes/event/${window.storeAdminTaxEventUuid}/application/products`, taxApplicationsResponse.data);
mockAxios.mockResponse({ status: 200 });
}, 0);