我的 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);