1

我有一个简单的登录 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');
});

我研究并发现这篇文章与我的问题很接近。但在所有情况下,我都会收到 TypeError: Cannot read property 'baseUrl' of undefined

为什么这不能知道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
    } 
4

1 回答 1

0

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

在 setupTests.js 中,我添加了

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

这修复了 TypeError: Cannot read property 'baseUrl' of undefined 问题。

于 2020-09-04T08:27:56.743 回答