gpt4 book ai didi

reactjs - 即使在执行 fetch.mockResponse 之后仍使用 Jest 实际获取被调用

转载 作者:行者123 更新时间:2023-12-05 06:25:59 28 4
gpt4 key购买 nike

我是 React 新手,正在尝试使用 Jest 编写我的第一个测试用例。我必须模拟获取响应。我正在使用 jest-fetch-mock。但调用将进行实际提取,返回的数据未定义。

package.json :

“jest-fetch-mock”:“^2.1.2”


setupTest.js 文件

global.fetch = require('jest-fetch-mock');

实际的api调用方式:

static fetchUserInfo(){
return dispatch => {
fetch('https://localhost:55001/api/userInfo')
.then(this.httpResponseHandler.handleHttpResponse)
.then ((resp) => resp.json())
.then(data => dispatch(this.onUserInfoGetSuccess(data)))
.catch( error => {
dispatch(this.onFetchFailure(error));
});
};
}

测试用例

it('should get user info', () => {
fetch.mockResponse(JSON.stringify({
"name": "swati joshi",
}
));

let data = ActualDataApi.fetchUserInfo();
console.log(data);
expect(data.name).toEqual('swati joshi');
}

因为 fetchUserInfo 是调度程序(使用 Redux 和 React)那么如何模拟它?提前致谢!

最佳答案

fetch 可能未正确模拟...但看起来您的主要问题是 fetchUserInfo 返回一个函数

应该在 dispatch mock 上调用它返回的函数,以验证它是否派发了正确的操作。

另请注意,fetchUserInfo 返回的函数是异步的,因此您需要一种方法在测试期间等待它完成。

如果您修改 fetchUserInfo 返回的函数以返回 Promise,如下所示:

static fetchUserInfo(){
return dispatch => {
return fetch('https://localhost:55001/api/userInfo') // <= return the Promise
.then(this.httpResponseHandler.handleHttpResponse)
.then((resp) => resp.json())
.then(data => dispatch(this.onUserInfoGetSuccess(data)))
.catch(error => {
dispatch(this.onFetchFailure(error));
});
};
}

...然后你可以这样测试它:

it('should get user info', async () => {  // <= async test function
fetch.mockResponse(JSON.stringify({
"name": "swati joshi",
}));

let func = ActualDataApi.fetchUserInfo(); // <= get the function returned by fetchUserInfo
const dispatch = jest.fn();
await func(dispatch); // <= await the Promise returned by the function
expect(dispatch).toHaveBeenCalledWith(/* ...the expected action... */);
});

关于reactjs - 即使在执行 fetch.mockResponse 之后仍使用 Jest 实际获取被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56520314/

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