Jest.js 2个不同的axios模拟示例返回axios错误,默认值不是函数

ezykj2lf  于 2023-06-20  发布在  Jest
关注(0)|答案(1)|浏览(185)

在我的函数eventController中。axios调用有两种实现方式第一种是在这段代码上

axios.post(
           `${url}/API1`,
           {
              data:'data for API1'
           }
        )

那这是第二次了

await axios({
     method: 'POST',
     url: `${url}/API2`,
     data: {
         data:'data for API2'
     }
  })

在一个函数/控制器中调用2个不同的axios
我被分配在实现一个单元测试,为这使用jest在typescript
到目前为止我做的是

jest.mock('axios', () => ({
   post: jest
      .fn()
      .mockResolvedValueOnce({ status: 200 }) 
}));

    it("should work", async () => {
      const req = {body: {
     data: 'data for API'
}}
      const response = await eventController(req);

      expect(response.status).toBe(200);
   });

我用.post方法模拟了第一个axios调用,但是当使用默认的axios模块进行第二个调用时,我收到了这个错误

TypeError: (0 , axios_1.default) is not a function

我也试过这样做,但似乎都不起作用:

jest.mock('axios', () => ({
   __esModule: true,
   default: jest.fn(),
   post: jest
      .fn()
      .mockResolvedValueOnce({ status: 200 }) 
}));

还有这个

jest.mock('axios', () => ({
           __esModule: true,
           default: { 
post: jest
              .fn()
              .mockResolvedValueOnce({ status: 200 })
    },
          
        }));

希望有人能在这件事上帮我。这是我当前使用的库的版本

  • “jest”:“^27.0.6”
  • babel-jest”:“^27.0.6”
  • “axios”:“^0.21.4”,
  • @types/jest”:“^27.0.0”,
  • “ts-jest”:“^27.0.4”,
qacovj5a

qacovj5a1#

只需要使用jest.mock(moduleName, factory, options),不传递factory参数,让jest用自动模拟的版本模拟一个模块。而且,没有__mocks__目录。
在mocking之后,您需要处理axios函数和axios.get()方法的TS类型,使用类型转换来完成此操作。
注意:我使用一个简单的字符串作为模拟解析值,它不匹配AxiosResponse接口。
例如
main.ts

import axios from 'axios';

const url = 'http://localhost:3000';
export async function main() {
  const res1 = await axios.post(`${url}/API1`, {
    data: 'data for API1',
  });
  console.log('res1: ', res1);
  const res2 = await axios({
    method: 'POST',
    url: `${url}/API2`,
    data: {
      data: 'data for API2',
    },
  });
  console.log('res2: ', res2);
}

main.test.ts

import { main } from './main';
import axios from 'axios';

jest.mock('axios');

const axiosMock = axios as jest.MockedFunction<typeof axios>;
const axiosPostMock = axios.post as jest.MockedFunction<typeof axios.post>;

test('should pass', async () => {
    expect(jest.isMockFunction(axios)).toBe(true);
    expect(jest.isMockFunction(axios.post)).toBe(true);
    axiosPostMock.mockResolvedValueOnce('fake data 1');
    axiosMock.mockResolvedValueOnce('fake data 2' as any);
    await main();
});

测试结果:

PASS  stackoverflow/76407602/main.test.ts (38.236 s)
  ✓ should pass (48 ms)

  console.log
    res1:  fake data 1

      at stackoverflow/76407602/main.ts:8:11

  console.log
    res2:  fake data 2

      at stackoverflow/76407602/main.ts:16:11

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        41.384 s

相关问题