TypeError:开玩笑:转换必须导出某些东西

Posted

技术标签:

【中文标题】TypeError:开玩笑:转换必须导出某些东西【英文标题】:TypeError: Jest: a transform must export something 【发布时间】:2021-08-13 21:09:12 【问题描述】:

配置jestnode.jstypescript 后,脚本npx jest 在控制台中抛出错误

TypeError: Jest: a transform must export something.
    at C:\projects\project-api\node_modules\@jest\transform\build\ScriptTransformer.js:386:19
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
    at async Promise.all (index 0)
    at async ScriptTransformer.loadTransformers (C:\projects\project-api\node_modules\@jest\transform\build\ScriptTransformer.js:378:5)
    at async createScriptTransformer (C:\projects\project-api\node_modules\@jest\transform\build\ScriptTransformer.js:1105:3)
    at async C:\projects\project-api\node_modules\@jest\core\build\TestScheduler.js:283:31
    at async Promise.all (index 0)
    at async TestScheduler.scheduleTests (C:\projects\project-api\node_modules\@jest\core\build\TestScheduler.js:276:5)
    at async runJest (C:\projects\project-api\node_modules\@jest\core\build\runJest.js:387:19)
    at async _run10000 (C:\projects\project-api\node_modules\@jest\core\build\cli\index.js:408:7)

jest.config.js

export default 
  roots: [
    '<rootDir>/src'
  ],
  testMatch: [
    '**/__tests__/**/*.+(ts)',
    '**/?(*.)+(test).+(ts)'
  ],
  transform: 
    '^.+\\.(ts)$': 'ts-jest'
  

我在哪里配置不正确?

【问题讨论】:

我能够通过将ts-jest 更新到最新版本(例如yarn add ts-jest@next)来解决此问题。见GitHub issue 【参考方案1】:

我遇到了同样的问题。

对我来说,最终是因为我有以下软件包的旧版本:

ts-loader ts-jest ts 节点

【讨论】:

这个答案的排列略有不同,我没有安装ts-loader,用yarn add --dev ts-loader安装解决了它 如果使用 npm 然后使用npm i ts-loader --save-dev 安装它以避免包管理器之间的不一致【参考方案2】:

运行yarn add ts-jest@next 为我解决了这个问题。

【讨论】:

这个答案取决于“下一个”,它会随着时间而改变。你安装了哪个版本的 ts-jest?【参考方案3】:

我尝试通过 Node 调试器(类似于 node inspect test.js)调试 Jest,但我找到了罪魁祸首。对我来说是jest-svg-transformer 包。显然,它与jest@27 不兼容。

通常,如果 jest.config.jstransform 部分中的某些项目损坏,则会引发此错误。

【讨论】:

也发生在我身上。换成jest-transform-stub【参考方案4】:

我遇到了这个错误,它最终成为我的jest.config (transform) 中的错误配置。

我有一个属性应该在moduleNameMapper 而不是transform。一旦我更新了文件,jest 就正确执行了。

jest.config.js:

module.exports = 
  preset: 'ts-jest',
  testEnvironment: 'jsdom',
  testPathIgnorePatterns: ['/node_modules/', '/dist'],
  collectCoverage: true,
  verbose: true,
  transform: 
    '^.+\\.(js|jsx|ts|tsx)$': '<rootDir>/node_modules/babel-jest',
  ,
  moduleNameMapper: 
    '\\.(css|scss|less)$': '<rootDir>/test/styleMock.js',
  ,
;

styleMock.js:

module.exports = ;

【讨论】:

【参考方案5】:

就我而言,我的 jest(主要版本 26)和 ts-jest(主要版本 27)的版本不匹配。将 ts-jest 降级到主要版本 26 解决了我的问题。

【讨论】:

【参考方案6】:

我的错是自定义转换器导出了 process 函数但不是默认导出,所以我已经按照 jest v27 的相关文档进行了工作:https://jestjs.io/docs/next/code-transformation#typescript-with-type-checking

【讨论】:

以上是关于TypeError:开玩笑:转换必须导出某些东西的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:某些东西不是函数

开玩笑测试 - TypeError:document.createRange 不是函数

用 TypeScript 开玩笑:TypeError: environment.teardown 不是函数

TypeError:state.customerComplaints.add 不是开玩笑单元测试中的函数

开玩笑 - 测试给出错误 TypeError: Cannot read property 'then' of undefined

TypeError:无法使用玩笑读取未定义的属性“原型”