即使在执行fetch.mockResponse之后仍使用Jest调用实际的提取

时间:2019-06-10 03:52:35

标签: reactjs jestjs jest-fetch-mock

我是新来的反应者,尝试使用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结合使用),然后如何模拟它? 预先感谢!

1 个答案:

答案 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... */);
});