在使用 axios 测试 ajax 模块时遇到问题

Posted

技术标签:

【中文标题】在使用 axios 测试 ajax 模块时遇到问题【英文标题】:Having trouble Jest testing ajax modules with axios 【发布时间】:2016-11-02 22:37:35 【问题描述】:

我有一个名为 ajax.js 的模块,它为我导出了一堆 ajax 函数。我正在尝试用 Jest 测试以下功能:

export const status = (loginUrl='/', logoutUrl='/') => 
  return axios.get(`/auth?login=$loginUrl&logout=$logoutUrl`);
;

我的测试如下所示:

jest.unmock('../ajax');

import  status  from '../ajax';

describe('ajax', () => 
  let urls;

  beforeEach(() => 
    urls = 
      loginUrl: '/',
      logoutUrl: '/'
    ;
  );

  it('calls status with a login and logout url', () => 
    const  loginUrl, logoutUrl  = urls;

    status(urls);
    expect(axios.get).toBeCalledWith(`/auth?login=$loginUrl&logout=$logoutUrl`);
  );
);

我的测试中不断出现运行时错误:

如果我unmock axios,错误就会消失,但这对我没有帮助,因为我希望 axios 被嘲笑!

此外,由于这一行,错误似乎正在发生:

import  status  from '../ajax';

为什么 Jest 在 axios 上苦苦挣扎。为什么只是导入我的status 函数会导致此错误?我在这里做错了吗?

【问题讨论】:

您好,您找到解决此问题的方法了吗? 【参考方案1】:

这是基于以下的解决方案:

"jest": "^24.8.0",
"ts-jest": "^24.0.2",
"tslint": "^5.18.0",
"typescript": "^3.5.3"
"axios": "^0.19.0",
"@types/jest": "^24.0.17",

ajax.ts:

import  status  from './ajax';
import axios from 'axios';

const originalGet = axios.get;
axios.get = jest.fn();

describe('ajax', () => 
  let urls;

  beforeEach(() => 
    urls = 
      loginUrl: '/',
      logoutUrl: '/'
    ;
  );

  afterEach(() => 
    axios.get = originalGet;
  );

  it('calls status with a login and logout url', async () => 
    const  loginUrl, logoutUrl  = urls;
    (axios as jest.Mocked<typeof axios>).get.mockResolvedValueOnce('mocked data');
    const actualValue = await status(urls);
    expect(actualValue).toBe('mocked data');
    expect(axios.get).toBeCalledWith(`/auth?login=$loginUrl&logout=$logoutUrl`);
  );

  it('should restore original get', () => 
    expect(jest.isMockFunction(axios.get)).toBeFalsy();
  );
);

单元测试结果:

 PASS  src/***/38129774/ajax.spec.ts
  ajax
    ✓ calls status with a login and logout url (7ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.906s, estimated 3s

【讨论】:

以上是关于在使用 axios 测试 ajax 模块时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Vue-CLI项目-axios模块前后端交互(类似ajax提交)

前后台交互ajax请求模块

遇到网络错误时如何在iOS上调试Axios?

使用axios发送ajax请求时如何添加token?

vue-axios框架详解

vue项目中使用axios发送ajax