如何通过ES6类中定义的函数测试异步axios调用?

时间:2019-12-19 08:48:35

标签: javascript ecmascript-6 jestjs axios

我想测试一个类内的异步函数,该类使用axios进行Web服务器调用,并且出现错误提示

Received promise rejected instead of resolved
Rejected to value: [TypeError: errorHandler is not a function]

我进行通话的实际代码如下:

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);
   }
}

我的测试文件如下

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

jest.mock('axios');

beforeEach(() => {
  instance = 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();
   axios.post.mockImplementationOnce(() => {
    return Promise.resolve({
      data:['John Doe', 'Charles']
    });
  });

  const response = await myClass.getUsers('url', {}, successHandler, errorHandler);
  console.log(response);  // This logs undefined
  expect(successHandler).toHaveBeenCalledTimes(1);
});

此外,我只想清除一下,在我的__mocks__目录下有一个src文件夹,在其中有一个名为axios.js的文件,在其中进行了模拟每个axios方法。看起来像这样:

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

谢谢。

2 个答案:

答案 0 :(得分:1)

Jest documentation明确表示:

  

当我们在测试中需要该模块时,需要。显式调用jest.mock('./moduleName')

所以您需要致电

jest.mock('axios')

为了使用您的__mocks__/axios.js

答案 1 :(得分:0)

我认为问题在于您的类使用的是实际包,而您的spec文件使用的是模拟包。

您必须直接在您的规范文件或setupTests.js文件中对其进行模拟:

import axios from 'axios'

jest.spyOn(axios, 'post')
  .mockImplementationOnce(...)

编辑:也许尝试在您的步骤文件顶部调用jest.mock('axios');。有点重复,但有时Jest只是需要此命令才能正确模拟。