我是新来的反应者,尝试使用Jest编写我的第一个测试用例。我必须模拟获取响应。我正在使用jest-fetch-mock。但是调用将进行实际的提取,返回的数据是不确定的。
package.json:
“笑话提取模拟”:“ ^ 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结合使用),然后如何模拟它?
预先感谢!
答案 0 :(得分:0)
fetch
的模拟可能不正确...但是,看来您的主要问题是fetchUserInfo
返回一个函数。
应该在dispatch
模拟中调用它返回的函数,以验证它是否分派了正确的操作。
还要注意,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... */);
});