React Jest TypeError:无法读取未定义的属性“ baseUrl”

时间:2020-09-04 07:12:57

标签: reactjs jestjs axios jest-mock-axios

我有一个简单的登录api调用,其中基本URL位于配置文件中,下面的代码

api.js

export const login = (username, password) => {
    Axios.post(`${config.loginApi.baseUrl}/login`, {
        username,
        password
    })
    .then(res => res)
    .catch(e => e);
};

我在下面编写了测试用例,

api.test.js

import axios from 'axios';
import { login } from './api';
import MockAdapter from 'axios-mock-adapter';
import config from 'config';


describe('signin signup Api', () => {
    
afterEach(() => {
        jest.restoreAllMocks();
    });

    it('logs in successfully', (done) => {
        const mock = new MockAdapter(axios);
        mock.onGet(`${config.loginApi.baseUrl}/login`).reply(200, { data: '1234abcd' });
        login('dee@gmail.com', 'test').then((res)=>{
            expect(res).toEqual('1234abcd');
            done();
        });
});

或我之前编写的另一个测试用例

import axios from 'axios';
import { login } from './api';
import config from 'config';

jest.mock('axios');

it('logs in successfully', async () => {
      axios.post.mockImplementationOnce(() => Promise.resolve({ data: '1234abcd' }));
      await expect(login('dee@gmail.com', 'test')).resolves.toEqual('1234abcd');
});

我进行了研究,发现 this post 与我的问题接近。但是在所有情况下 TypeError:无法读取未定义的属性“ baseUrl”

为什么它不知道baseUrl?

我尝试模拟配置,

jest.mock(config);

得到TypeError:moduleName.split不是一个函数。

请提出修正/解决方法。

添加有关配置的更多信息

我在配置文件夹中

require('dotenv').config();

module.exports = config;

在开发环境中,它将从dev.js,prod-prod.js等中选择此配置

在我拥有的dev.js文件的公用文件夹中

loginApi: {
        baseUrl: 'https://abcd.com',
        mocks: true,
        mockDelay: 2000
    } 

1 个答案:

答案 0 :(得分:0)

我找到了解决此问题的方法,

在setupTests.js中,我添加了

global.config ={
   loginApi: {
        baseUrl: 'https://abcd.com',
        mocks: true,
        mockDelay: 2000
    } 
}

此修复了TypeError:无法读取未定义问题的属性'baseUrl'。