gpt4 book ai didi

javascript - Jest 模拟和错误处理 - Jest 测试跳过我函数的 "catch"

转载 作者:行者123 更新时间:2023-11-29 23:15:53 29 4
gpt4 key购买 nike

我正在创建一个 Jest 测试来测试是否记录了用于 superFetch 函数错误处理的指标。我的方法是为 retryFetch 创建一个模拟函数并返回一个 Promise 拒绝事件。我希望它能进入 superFetch 捕获,但它会一直在 superFetch 中结束。我该如何处理 superFetch catch 中的错误?

这些是函数:

// file: fetches.js
export function retryFetch(url) {
return new Promise((resolve, reject) => {
fetch(url).then(response => {
if (response.ok) {
resolve(response);
return;
}
throw new Error();
}).catch(error => {
createSomething(error).then(createSomething => {
reject(createSomething);
});
return;
});
});
});

export function superFetch(url, name, page) {
return retryFetch(url)
.then(response => {
return response;
}).catch(error => {
Metrics.logErrorMetric(name, page);
throw error;
});
}

我的 Jest 测试:

import * as fetch from '../../src/utils/fetches';

describe('Fetch fails', () => {
beforeEach(() => {
fetch.retryFetch = jest.fn(() => Promise.reject(new Error('Error')));
});

it('error metric is logged', () => {
return fetch.superFetch('url', 'metric', 'page').then(data => {
expect(data).toEqual(null);
// received data is {"ok": true};
// why is it even going here? im expecting it to go skip this and go to catch

}).catch(error => {
// this is completely skipped. but I'm expecting this to catch an error
// received error is null, metric was not called
expect(Metrics.logErrorMetric).toHaveBeenCalled();
expect(error).toEqual('Error');
});
});
});

最佳答案

问题是你覆盖了导出模块中的函数,但是 superFetch 使用了模块内部的原始函数,所以覆盖不会有任何效果。

你可以像这样直接模拟fetch:

global.fetch = jest.mock(()=> Promise.reject())

关于javascript - Jest 模拟和错误处理 - Jest 测试跳过我函数的 "catch",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52797499/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com