【问题标题】:How to test axios api using jest and react testing library?如何使用 jest 和 react 测试库测试 axios api?
【发布时间】:2021-06-04 18:27:33
【问题描述】:

这是我编写 axios 逻辑的 apis.js

import axios from 'axios'

function logSuccess(req, res, next) {
  console.log(req, res)

  next(res)
}

function logError(req, res, e, next) {
  console.log(req, res, e)

  next(e)
}

function getResource(url, onComplete) {
  let _onSuccess = (res) => logSuccess(url, res, onComplete)
  let _onError = (res, e) => logError(url, res, e, onComplete)
  let _onException = (e) => logError(url, null, e, onComplete)

  axios
    .get(url)

    .then((res) => {
      res ? _onSuccess(res) : _onError(res)
    }, _onException)

    .catch(_onException)
}

function postResource(url, data, cancelTokenSource, onComplete) {
  let _onSuccess = (res) => logSuccess(url, res, onComplete)
  let _onError = (res, e) => logError(url, res, e, onComplete)
  let _onException = (e) => logError(url, null, e, onComplete)

  axios
    .post(url, data, { cancelToken: cancelTokenSource.token })

    .then((res) => {
      res ? _onSuccess(res) : _onError(res)
    }, _onException)

    .catch(_onException)
}

const apis = {
  getResource,
  postResource,
}

export default apis

这是我调用 axios 函数的另一个文件:

    import apis from '../../commonUtils/apis/apis'

export default class LookingGlassAPIs {
  constructor(params) {
    let { apiRoot } = params

    this.routers = {}
    this.commandRequests = {}

    this.routers.getAll = (...rest) =>
      apis.getResource(apiRoot + 'routers', ...rest)
    this.commandRequests.post = (...rest) =>
      apis.postResource(apiRoot + 'commandRequests', ...rest)
  }
}
 const apiRoot = 'http://127.0.0.1:8080/'

我是新来的反应我不知道为 axios 编写测试用例而不点击 api。任何人都可以帮助我。url 在另一个文件中定义但仅供参考,我只在此处标明。我应该使用 axios.get.mockResolvedValue(data)???是正确的方式吗??

【问题讨论】:

    标签: reactjs jestjs react-testing-library


    【解决方案1】:

    您必须模拟 axios 并查看是否使用正确的参数调用 axios 方法。

    apis.spec.js

    import apis from './apis';
    
    jest.mock('axios'); // This overwrites axios methods with jest Mock
    import axios from 'axios';
    
    describe('Test Apis', () => {
        describe('getResource', () => {
            describe('with success', () => {
                const url = 'http://test-url.com';
                const onComplete = jest.fn();
                const data = {};
    
                beforeEach(() => {
                    axios.get.mockResolvedValue(data);
                });
    
                it('should call axios get with given url', () => {
                    getResource(url, onComplete);
                    expect(axios.get).toBeCalledWith(url);
                });
    
                it('should call onComplete callback with response', async () => { // do not forget 'async'
                    await getResource(url, onComplete); // notice the 'await' because onComplete callback is called in '.then'
                    expect(onComplete).toBeCalledWith(data);
                });
            });
        });
    });
    

    您可以对错误响应和 POST 方法执行相同的操作。您还可以通过模拟您的 apis.js 方法或再次模拟 axios 来测试您的 LookingGlassAPIs,这取决于您项目中的“单元”定义。

    【讨论】:

      【解决方案2】:

      只要你想测试的函数不返回任何东西,你就可以测试它们是否抛出。

      您需要监视您的 axios 方法,模拟返回值(在本例中为 Promise),例如:

      import axios from 'axios';
          
      beforeAll(() => {
        axios.get.mockImplementation(() => Promise.resolve('whatever-get'));
        axios.post.mockImplementation(() => Promise.resolve('whatever-post'));
      });
          
      afterAll(() => {
        jest.clearAllMocks();
      });
          
      test('get does not throw', () => {
        expect(getResource()).not.toThrow();
      });
          
      test('post does not throw', () => {
        expect(postResource()).not.toThrow();
      });
      

      【讨论】:

      • 你的意思是调用expect(apis.getResource()).not.toThrow();????以及如何检查 get 的结果是什么???
      • 如果您要导出两个函数,如{getResource, postResource} 是的。问题是您没有将获取结果保存在任何地方..
      • 这是否期望(apis.getResource('127.0.0.1:8080/routers')).not.toThrow() 并得到错误 TypeError: Cannot read property 'then' of undefined ?? 有什么帮助吗??
      • 感谢更新的答案。但我仍然遇到同样的错误。
      猜你喜欢
      • 2019-04-22
      • 2020-03-24
      • 2020-06-14
      • 2020-06-01
      • 2021-09-20
      • 2021-06-14
      • 2021-12-03
      • 2021-12-06
      • 2021-11-30
      相关资源
      最近更新 更多