在使用 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 模块时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章