我有一个 Redux
saga,它发出多个 API 请求。我正在使用 takeLatest
来确保在触发新操作时取消任何之前运行的 sagas。但是,这不会取消飞行中的请求,我们遇到了最大连接限制问题。
为了解决这个问题,我在 saga 中创建了一个 AbortController 并将其传递给每个请求,这样它们就可以在 saga 被取消时中止(见下文):
export function* doSomething(action: Action): SagaIterator {
const abortController = new AbortController();
try {
const fooResponse: FooResponse = yield call(getFoo, ..., abortController);
...
const barResponse: BarResponse = yield call(getBar, ..., abortController);
}
catch {
.. handle error
}
finally {
if (yield cancelled()) {
abortController.abort(); // Cancel the API call if the saga was cancelled
}
}
}
export function* watchForDoSomethingAction(): SagaIterator {
yield takeLatest('action/type/app/do_something', doSomething);
}
但是,我不确定如何检查是否调用了 abortController.abort()
,因为 AbortController 是在 saga 中实例化的。有没有办法模拟这个?
最佳答案
为了测试 AbortController
的 abort
函数,我在测试中模拟了 global.AbortController
。
例子:
const abortFn = jest.fn();
// @ts-ignore
global.AbortController = jest.fn(() => ({
abort: abortFn,
}));
await act(async () => {
// ... Trigger the cancel function
});
// expect the mock to be called
expect(abortFn).toBeCalledTimes(1);
关于javascript - 如何在 Jest 中模拟 AbortController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66588109/