Javascript 当我使用jest从模拟axios调用返回一些响应时,变得未定义

Javascript 当我使用jest从模拟axios调用返回一些响应时,变得未定义,javascript,unit-testing,jestjs,axios,Javascript,Unit Testing,Jestjs,Axios,我试图模拟axios调用并验证响应,但当我记录模拟axios调用的响应时,我得到了未定义的。有人知道为什么吗 users.js import axios from 'axios'; export default class MyClass{ constructor(config){ this.config = config; } async getUsers(url, params, successHandler, errorHandler) { r

我试图模拟axios调用并验证响应,但当我记录模拟axios调用的响应时,我得到了未定义的
。有人知道为什么吗

users.js

import axios from 'axios';

export default class MyClass{
   constructor(config){
      this.config = config;
   }

   async getUsers(url, params, successHandler, errorHandler) {
      return axios.post(url, params)
             .then(resp => this.handleAPIResponse.call(this, resp, successHandler, errorHandler))
             .catch(error => errorHandler);
   }
}
users.test.js

import MyClass from './mycode.js';
import axios from 'axios';

jest.mock('axios');

beforeEach(() => {
  myClass = new MyClass({ env: 'prod' });
});

afterEach(() => {
  jest.clearAllMocks();
});

const mockResponseData = jest.fn((success, payload) => {
  return {
    data: {
      result: {
        success,
        payload
      }
    }
  };
});

test('should return all the users', async () => {
   const successHandler = jest.fn();
   const errorHandler = jest.fn();
   const users = mockResponseData(true, ['John Doe', 'Charles']);

   axios.post.mockImplementationOnce(() => {
     return Promise.resolve(users);
   });

   const response = await myClass.getUsers('url', {}, successHandler, errorHandler);
   console.log(response);  // This logs undefined
   expect(successHandler).toHaveBeenCalledTimes(1);
});
另外,我只想澄清一下,我的src目录下有一个mocks文件夹,其中有一个名为axios.js的文件,我在其中模拟了axios的post方法。看起来是这样的:

export default {
  post: jest.fn(() => Promise.resolve({ data: {} }))
};

这是不带
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。仅使用
jest.mock()

users.js

从“axios”导入axios;
导出默认类MyClass{
构造函数(配置){
this.config=config;
}
异步getUsers(url、参数、successHandler、errorHandler){
返回轴
.post(url,参数)
.then((resp)=>this.handleAPIResponse.call(this,resp,successHandler,errorHandler))
.catch((错误)=>errorHandler);
}
异步handleAPIResponse(resp、successHandler、errorHandler){
successHandler();
返回响应;
}
}
users.test.js

从“/users”导入MyClass;
从“axios”导入axios;
mock('axios',()=>{
返回{
post:jest.fn(()=>Promise.resolve({data:{})),
};
});
描述('59416347',()=>{
让我来上课;
在每个之前(()=>{
myClass=新的myClass({env:'prod'});
});
之后(()=>{
开玩笑。clearAllMocks();
});
const mockResponseData=jest.fn((成功,有效负载)=>{
返回{
数据:{
结果:{
成功,,
有效载荷,
},
},
};
});
test('应该返回所有用户',async()=>{
const successHandler=jest.fn();
const errorHandler=jest.fn();
const users=mockResponseData(true,['John Doe','Charles']);
axios.post.mockImplementationOnce(()=>{
返回承诺。解析(用户);
});
const response=await myClass.getUsers('url',{},successHandler,errorHandler);
控制台日志(响应);
expect(response.data.result).toEqual({success:true,payload:['johndoe','Charles']});
期望(successHandler).toHaveBeenCalledTimes(1);
});
});
单元测试结果和覆盖率报告:

PASS src/stackoverflow/59416347/users.test.js(9.166s)
59416347
✓ 应返回所有用户(18ms)
console.log src/stackoverflow/59416347/users.test.js:41
{data:{result:{success:true,有效负载:[Array]}}
----------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
----------|----------|----------|----------|----------|-------------------|
所有文件| 90.91 | 100 | 83.33 | 90.91 ||
users.js | 90.91 | 100 | 83.33 | 90.91 | 12|
----------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:10.518秒

源代码:

获取
未定义的
取决于
handleAPIResponse
缺少的实现。如果它丢失了-这就是为什么你没有定义。如果没有遗漏,请更新您的问题,我知道问题出在哪里了。因为我调用了另一个函数,并且没有从
handleAPIResponse
返回任何数据,所以我没有定义。@VinayMehta Yes。我看到您调用了
handleAPIResponse
方法,所以我添加了一个简单的方法,您也可以存根这个方法并返回一些存根值。