【问题标题】:Mocking a function called inside a then block in a React Component在 React 组件的 then 块中模拟调用的函数
【发布时间】:2018-03-03 11:23:59
【问题描述】:

我正在尝试通过使用 Jest 创建一个函数的模拟来测试一个函数(作为道具传递给 React 组件)是否使用预期的参数被调用。

下面是我要测试的功能:

handlerFunction() {

let response = [];
this.props.files.forEach((file) => {

  let responseObject= this.getResponse(file);
  responseObject.then((result) => {

    response.push({

      fileName: file.name,
      records: result,

    });

    this.props.sendResponseData(response);

  });

});

}

getResponse(file) {

return new Promise((resolve, reject) => {

  axios.post(URL, file).then((response) => {

    resolve(response.data);

  }).catch((error) => {

    reject(console.error(error));

  });

});

}

handlerFunction() 调用 getResponse() 进行 AJAX 调用并在 Promise 中返回响应数据。 handlerFunction() 获取从 getResponse() 返回的响应数据,并将响应数据和相应的文件名推送到 response[] 中,然后调用 this.props.sendResponseData() 。我模拟了 getResponse() 并让它返回一个虚拟响应数据并测试 this.props.sendResponseData() 是否被我在测试类中创建的 dummyResponse 调用。

这是我为在 React 组件中测试上述功能而编写的代码:

it('handlerFunction', () => {
files= [dummyFile];
sendResponseData = jest.fn();

let wrapper = shallow(<RenderComponent
                       files={files}
                       sendResponseData={sendResponseData}
                       />);

let dummyAJAXResponse = {};
let dummyResponse = [{ fileName: 'file', records: dummyAJAXResponse }];

const getResponseMock= jest.fn(() => {

 return new Promise((resolve) => {

   resolve(dummyAJAXResponse);

 });

});
wrapper.instance().getResponse= getResponseMock ;
wrapper.update();
wrapper.instance().handlerFunction();
expect(sendResponseData).toBeCalledWith(dummyResponse);
})

当我尝试运行此测试时,它失败并显示如下:

expect(jest.fn()).toBeCalledWith(expected)

Expected mock function to have been called with:
  [[{"fileName": "file", "records": {}}]]
But it was not called.

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: reactjs jestjs enzyme


    【解决方案1】:

    尝试在 axios 之前添加 rerun。 像这样:

    return new Promise((resolve, reject) => {
    
      return axios.post(URL, file).then((response) => {
    

    return new Promise((resolve, reject) => (
    
      axios.post(URL, file).then((response) => {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 2020-06-24
      • 2019-06-30
      • 2017-07-20
      • 1970-01-01
      • 2021-10-31
      • 2019-07-22
      相关资源
      最近更新 更多