mockAxios运行中被App.js调用的原理

来源:10-6 App.js 主入口文件测试编码

爱笑的小熊猫

2020-12-26

请问老师为何__mocks__中的axios.js可以在运行中自动被App.js用来替代真正的axios

我按着例子实现了这个axis的mock部分,可是mockAxios中的get总是不被调用到,App.js仍然调用真正的axios

请求老师帮助 谢谢!

我的代码实现在这个github中可以看到
https://github.com/cutePanda123/invoice-app/tree/master/src

写回答

1回答

张轩

2020-12-29

同学你好 谢谢你认真的写代码发现了这个问题 这是新版 create-react-app 的一个 bug,issue 在这里都放了一年了,还没有修复。https://github.com/facebook/create-react-app/issues/7539

我建议你不要 __mocks__ 文件夹进行了 mock 了,而是在 test case 中直接 mock,你可以尝试我下面的代码 文档在这里:https://jestjs.io/docs/en/mock-functions#mocking-modules

import React from 'react';
import axios from 'axios'
import { testItems, testCategories } from './testData';
import { mount } from 'enzyme';
import App from './App';
jest.mock('axios')


//const waitForAsync = () => new Promise(resolve => setImmediate(resolve));

describe('App test', () => {
    afterEach(() => {
        jest.clearAllMocks();
    });

    it('getInitialData test', async () => {
        axios.get.mockImplementation(jest.fn((url) => {
            console.log("log output from mock axios!!!!!!!!!");
            if (url.indexOf('categories') > -1) {
                return Promise.resolve({
                    data: testCategories
              });
            }
            if (url.indexOf('transactions?') > -1) {
                return Promise.resolve({
                    data: testItems
                });
            }
            return Promise.resolve({
                data: {
                    ...testItems[0],
                    id: 'testId'
                }
            });
        }))
        const wrapper = mount(<App />);
        expect(axios.get).toHaveBeenCalledTimes(2);
    });
});


2
0

React16组件化+测试+全流程 实战在线账本项目

轻松上手,从设计图到上线,精通组件化思维和组件测试

713 学习 · 177 问题

查看课程