3

我的 react/redux 应用程序中有一个保存工作流程,需要两个 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调用解决了承诺,但是,使用开玩笑的调试器,我可以看到调用saveApplications永远不会发生。

https://www.npmjs.com/package/jest-mock-axios#axiosmockresponseresponse-requestinfo

如何告诉 jest 等到下一个 API 调用发生?我需要从onSave电话中返回承诺吗?

更新

这行得通......所以我怀疑它可以在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);
4

0 回答 0