javascript - 如何在 Jest 中模拟 AbortController

标签 javascript typescript jestjs mocking redux-saga

我有一个 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 中实例化的。有没有办法模拟这个?

最佳答案

为了测试 AbortControllerabort 函数,我在测试中模拟了 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/

相关文章:

reactjs - 与 create-react-app 开 Jest - 意外的 token 错误

javascript - 测试不运行,因为 typescript 在尝试测试类型检查时抛出错误

javascript - 从嵌套的 javascript 对象中删除属性的最佳方法是什么?

javascript - 如何在javascript中验证数字

typescript - 在 typescript 中将枚举类型作为参数传递

angular - 尝试将服务注入(inject) Angular 组件时出错 "EXCEPTION: Can' t 解析组件的所有参数”,为什么?

javascript - 如何使用 .ajax() 创建保存按钮

javascript - 理智错误 : `dataset` must be provided to perform queries with React

javascript - 使用 HTTP-Basic 身份验证的 Angular 6 HTTP Get 请求

javascript - 如何使用 Jest 测试对象的一部分?