首页 文章

在React组件中模拟一个名为then块的函数

提问于
浏览
0

我试图测试一个函数(作为道具传递给React组件)是否通过使用Jest创建它的模拟来调用期望的参数 .

以下是我要测试的功能:

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()并使它返回一个虚拟响应数据并测试是否使用我在测试类中创建的dummyResponse调用this.props.sendResponseData() .

这是我为在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.

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

1 回答

  • 0

    尝试在axios之前添加retrun . 像那样:

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

    要么

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

相关问题