如何使用Jest测试Fetch API类?需明确测试内容
如何测试这个Fetch API的静态
get方法? 先把你提供的代码贴出来方便参考:
static get(action, params = {}) { return new Promise((resolve, reject) => { fetch(UrlHelper.apiUrl(action, params), { credentials: 'same-origin' }) .then(response => { return Api.checkStatus(resolve, reject, response) }) .then(([ ok, response ]) => { return ok ? resolve(response) : reject(response); }); }); }
嘿,我来帮你梳理下这个方法该测哪些点——其实这里的Promise逻辑绝对是你测试的核心部分,毕竟整个方法对外暴露的就是一个Promise,它的resolve/reject行为直接决定了调用方的逻辑是否正常。咱们一步步拆解要测的内容:
验证请求的发送是否符合预期
- 首先得确保
fetch被正确调用:包括调用的URL是UrlHelper.apiUrl生成的正确地址,还有请求配置里的credentials是不是'same-origin'。要是请求地址错了或者配置不对,后面的逻辑再完美也没用。 - 测试时可以用Jest这类工具mock掉
fetch和UrlHelper.apiUrl,然后检查它们的调用参数是否和预期一致。
- 首先得确保
测试
checkStatus的处理分支- 这个
Api.checkStatus是中间处理的关键,它返回的[ok, response]数组直接决定了Promise的走向。你需要覆盖两种场景:- 当
checkStatus返回[true, 有效响应]时,要确保get方法的Promise正确resolve这个响应; - 当
checkStatus返回[false, 错误信息]时,要确保Promise正确reject这个错误。
- 当
- 同样可以mock
Api.checkStatus,让它分别返回成功/失败的结果,然后断言Promise的状态和返回值。
- 这个
必须测试Promise的完整行为
- 没错,你完全需要测试Promise!因为这个方法的对外契约就是返回一个Promise,所以必须验证它在各种场景下的表现:
- 当
fetch成功返回响应,且checkStatus判定为成功时,Promise要进入resolved状态,并且传递正确的响应数据; - 当
fetch抛出错误(比如网络故障),或者checkStatus判定失败时,Promise要进入rejected状态,并且传递对应的错误信息。
- 当
- 测试时可以用
async/await或者.then()/.catch()来断言Promise的结果是否符合预期,比如用await expect(Api.get(...)).rejects.toThrow(...)来验证错误分支。
- 没错,你完全需要测试Promise!因为这个方法的对外契约就是返回一个Promise,所以必须验证它在各种场景下的表现:
测试参数默认值的生效情况
- 方法里
params的默认值是{},所以要测试当不传params参数时,UrlHelper.apiUrl是否接收到了空对象作为参数,确保默认值逻辑正常工作。
- 方法里
给你举个简单的Jest测试示例,能直观看到怎么实现这些测试:
describe('Api.get', () => { beforeEach(() => { // 提前mock依赖 jest.spyOn(global, 'fetch').mockResolvedValue({ ok: true }); jest.spyOn(UrlHelper, 'apiUrl').mockReturnValue('https://example.com/api/test'); jest.spyOn(Api, 'checkStatus').mockResolvedValue([true, { data: 'test-data' }]); }); afterEach(() => { // 测试后恢复mock,避免影响其他用例 jest.restoreAllMocks(); }); test('sends fetch request with correct url and credentials', async () => { await Api.get('user-details', { userId: 123 }); expect(UrlHelper.apiUrl).toHaveBeenCalledWith('user-details', { userId: 123 }); expect(fetch).toHaveBeenCalledWith('https://example.com/api/test', { credentials: 'same-origin' }); }); test('resolves with response when checkStatus returns ok', async () => { const result = await Api.get('user-details'); expect(Api.checkStatus).toHaveBeenCalled(); expect(result).toEqual({ data: 'test-data' }); }); test('rejects with error when checkStatus returns not ok', async () => { // 覆盖mock,返回失败情况 Api.checkStatus.mockResolvedValue([false, new Error('Invalid token')]); await expect(Api.get('user-details')).rejects.toThrow('Invalid token'); }); });
内容的提问来源于stack exchange,提问作者ZPPP
相关产品推荐
相关产品推荐

