【问题标题】:How to resolve promise and spy on a function inside axios如何在 axios 中解决 Promise 和 spy 函数
【发布时间】:2019-08-10 23:18:16
【问题描述】:
function getusers(config){
     const {successCB} = config;
     return axios.get(url, params)
      .then(response => {
        successCB(response.data, config);
      });
}

************************ UT ******************************

const mock = new MockAdapter(axios);
const successCB = jest.fn();

mock.onGet(url).reply(200, 'success');
const axiosSpy = jest.spyOn(axios, 'get');
const successCBSpy = jest.spyOn(config, 'successCB');

getUsers({successCB});

axiosSpy 从下面的代码成功

expect(axiosSpy).toHaveBeenCalled();

但它并没有深入到内部解决成功CB的结果

expect(successCBSpy).toHaveBeenCalled();

抛出错误为:successCB never called

我做错了什么,我应该期待什么?

我只能使用 ES6 解决方案。

【问题讨论】:

    标签: javascript promise jestjs axios-mock-adapter


    【解决方案1】:

    确保您从getusers 返回Promise,以便您可以在测试中使用await

    这是一个完整的工作示例:

    const axios = require('axios');
    const MockAdapter = require('axios-mock-adapter');
    
    const url = 'test-url';
    const params = {};
    
    function getusers(config) {
      const { successCB } = config;
      return axios.get(url, params)  // <= return the Promise
        .then(response => {
          successCB(response.data, config);
        });
    }
    
    test('getusers', async () => {  // <= async test function
      const mock = new MockAdapter(axios);
      const successCB = jest.fn();
    
      mock.onGet(url).reply(200, 'success');
      const axiosSpy = jest.spyOn(axios, 'get');
    
      await getusers({ successCB });  // <= await the Promise
    
      expect(axiosSpy).toHaveBeenCalled();  // Success!
      expect(successCB.mock.calls[0][0]).toBe('success');  // Success!
    })
    

    更新

    如果async/await 语法不是一个选项,那么您可以在then 回调中执行断言并从测试中返回结果Promise,以便Jest 知道等待它:

    test('getusers', () => {
      const mock = new MockAdapter(axios);
      const successCB = jest.fn();
    
      mock.onGet(url).reply(200, 'success');
      const axiosSpy = jest.spyOn(axios, 'get');
    
      return getusers({ successCB }).then(() => {
        expect(axiosSpy).toHaveBeenCalled();  // Success!
        expect(successCB.mock.calls[0][0]).toBe('success');  // Success!
      });
    })
    

    【讨论】:

    • @Mithun 我只是提供了您需要做什么的总体思路。如果您使用实际测试代码更新您的问题,我将根据您共享的代码更新我的答案
    • @Mithun 我用一个完整的工作示例更新了我的答案
    • @Mithun 我添加了一个不使用async/await 语法的测试示例
    • @Mithun 我只是将这些 cmets 添加为表示测试通过的一种方式,但可以肯定的是,我可以删除它们
    • @Mithun 啊,我明白你现在在问什么。删除 config 作为 getuserssuccessCB 的第二个参数。我已经更新了答案中的代码和测试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多