Jest抛出TypeError:(0,_module.myFunction)不是函数,正在使用Jest测试导出的函数(非默认值)

a11xaf1n  于 2023-04-27  发布在  Jest
关注(0)|答案(2)|浏览(169)

所以我使用Jest,Typescript和Create-react-app
我做了这个测试:

import { defaultHeaders } from './http';

describe('http tests', () => {
  test('defaultHeaders()', () => {
    const headers = defaultHeaders(undefined);
    expect(headers).toEqual({ foo: 2 });
  });
});

代码位于文件http.ts的同一子目录中,看起来像这样:

export function defaultHeaders(headers?: FetchHeaders): FetchHeaders {
  return { 'Content-Type': 'application/json' };
}

当我运行jest测试时,它抛出:

TypeError: (0 , _http.defaultHeaders) is not a function

奇怪的是, Package 在默认函数或常量中的所有其他测试都可以工作。

有没有办法用Jest测试非默认导出的函数?

更新:

  • 我也试过把defaultHeaders转换成箭头函数,但没有用。
  • 并尝试将导入更改为:import * as http from './http'仍然会抛出相同的错误
mbzjlibv

mbzjlibv1#

更新答案

所以问题是,在src/setupTest.ts中,我包含了一个模块的mock,而没有我试图测试的函数,因此它是未定义的。

// mock our fetch wrapper to avoid doing http calls in tests
jest.mock('utilities/http/http', () => ({
  // NO defaultHeaders() function mocked that was the problem 
  getRequest: function () {
    return {
      json: {},
      status: 200,
    };
  },
  postRequest: function () {
    return {
      json: {},
      status: 200,
    };
  },
  request: function () {
    return {
      json: {},
      status: 200,
    };
  },
}));

如果我从setupTest.ts中删除mocked,那么我就可以对它进行单元测试了。

c0vxltue

c0vxltue2#

在我的例子中,问题出在路径上。我正在测试一个名为“index.js”的文件,我想当然地认为在导入函数时不需要将它包含在路径中。我错了。
错误代码:

import { myFunction } from '../my/path

正确代码:

import { myFunction } from '../my/path/index.js

相关问题