首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用axios拦截器模拟axios

使用axios拦截器模拟axios
EN

Stack Overflow用户
提问于 2019-02-02 00:17:42
回答 2查看 8.7K关注 0票数 14

我正在尝试使用mockAxios来测试axios拦截器。

代码语言:javascript
复制
export default {
    get: jest.fn(() => Promise.resolve({ data: {} }))
}

import axios from 'axios';

export const configurateAxios = () => {
    axios.interceptors.response.use(
        response => {
          return response;
        },
        error => {
          return Promise.reject(error);
        }
    );
}

当我创建mockAxios时:

代码语言:javascript
复制
export default {
    get: jest.fn(() => Promise.resolve(data: {}))
}

我的所有测试都失败了,并显示以下消息: cannot read property response of undefined my the axios interceptor。这是因为mock axios没有返回响应。它可以只返回一个普通对象。

那么,如何在mockAxios中使用axios拦截器进行测试呢?

EN

回答 2

Stack Overflow用户

发布于 2019-08-23 10:05:48

这就是我如何实现的

Interceptor.js

代码语言:javascript
复制
/* Module that I want to test
 * Intercepts every axios request and redirects to login on 401
 */

import axios from 'axios';

export default () => {
  axios.interceptors.response.use(
    response => {
      // Return a successful response back to the calling service
      return response;
    },
    error => {
      // Return any error which is not due to authentication back to the calling service
      if (error.response.status !== 401) {
        return new Promise((resolve, reject) => {
          reject(error);
        });
      } else {
        window.location.href = '/operator-portal/login';
        return false;
      }
    }
  );
};

Interceptor.test.js

代码语言:javascript
复制
import axios from 'axios';
import interceptor from '../../src/apis/interceptor';

jest.mock('axios');

describe('interceptor', () => {
  it('redirects to login route when response status is 401', () => {
    delete global.window.location;
    global.window = Object.create(window);
    Object.defineProperty(window, 'location', {
      value: {
        href: 'url'
      }
    });
    axios.interceptors.response.use = jest.fn((successCb, failCb) => {
      failCb({
        response: {
          status: 401
        }
      });
    });
    interceptor();
    expect(window.location.href).toEqual('/login');
  });

  it('redirects to login route when success handler is called', () => {
    axios.interceptors.response.use = jest.fn(successCb => {
      successCb();
    });
    interceptor();
    window.location.href = 'url';
    expect(window.location.href).toEqual('url');
  });
});
票数 3
EN

Stack Overflow用户

发布于 2019-07-17 21:49:08

为什么不直接使用标准的jest模拟来模拟axios get()方法呢?

这就是我要做的:

代码语言:javascript
复制
// Define how I want my mocked `get` to behave
const axiosMockedGet = async () => {
    return {
        data: 'the response from the GET request'
    };
};

// Mock axios
jest.mock('axios', () => {
    return jest.fn().mockImplementation(() => {
        return {
            // Inject a function named `get`
            get: sessionFunctionMock
        };
    });
});

在此之后,应该根据您的axiosMockedGet实现模拟所有对axios的get的调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54483256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档