Как вы тестируете связанные вызовы API в React с Jest? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть рабочий процесс сохранения в моем приложении «Реакция / сокращение», для которого требуется два вызова 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);
...