JEST - 语法错误:意外的令牌“导出”与 uuid 库

问题描述 投票:0回答:6

我曾经在仅使用 JavaScript 来使用 Jest 时解决了类似的错误,但目前我无法使用 Typescript 来解决类似的错误。

我的所有测试都运行良好,直到我安装了需要

@types/jest-environment-puppeteer
@types/puppeteer
@types/expect-puppeteer
的 Puppeteer。

安装它们后,puppeteer 测试运行完美,但其他测试开始失败并出现以下错误。

  D:\...\api\node_modules\uuid\dist\esm-browser\index.js:1    
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,jest){export { default as v1 } from './v1.js';
                                                                                      ^^^^^^  

    SyntaxError: Unexpected token 'export'

      at Runtime.createScriptFromCode (../node_modules/jest-runtime/build/index.js:1796:14)   
      at Object.require (../node_modules/@nestjs/common/decorators/core/injectable.decorator.js:4:16)

我做了什么?

allowJs: true
tsconfig.json
并在笑话配置上设置
transformIgnorePatterns
。这样 jest 就可以编译来自
node_modules/
的文件 之后这个错误停止了,但测试由于另一个奇怪的原因失败了。 更糟糕的是测试开始时间增加太多。

所以我离开了

allowJs
,就像原来的设置一样,并从

更新了笑话配置
"transform": {
   "^.+\\.(t|j)s$": "ts-jest"
}

"transform": {
   "^.+\\.(t)s$": "ts-jest"
}

所以目前 ts-jest 不编译 js 文件。但我认为我无法让 babel 选择

js
文件的转换。这些是我的笑话配置:

{
  "moduleFileExtensions": ["js", "json", "ts"],
  "rootDir": ".",
  "testEnvironment": "node",
  "testRegex": ".e2e-spec.ts$",
  "transform": {
    "^.+\\.(t)s$": "ts-jest",
    "^.+\\.(js|jsx)$": "babel-jest"
  },
  "transformIgnorePatterns": ["<rootDir>/node_modules/.+.(js|jsx)$"]
}
typescript jestjs babeljs puppeteer nest
6个回答
96
投票

感谢您的回复: https://stackoverflow.com/a/54117206/15741905

我开始在谷歌上搜索类似的修复程序,最后找到了这里: https://github.com/uuidjs/uuid/issues/451

这解决了我的问题:https://github.com/uuidjs/uuid/issues/451#issuecomment-1112328417

// jest.config.js
{
//................
  moduleNameMapper: {
    // Force module uuid to resolve with the CJS entry point, because Jest does not support package.json.exports. See https://github.com/uuidjs/uuid/issues/451
    "uuid": require.resolve('uuid'),
  }
}

如果可以使用 jest-babel 来解决这个问题,我仍然会很高兴。

因为我必须将笑话配置从

package.json
转移到单独的
.js
文件中。

编辑: 根据这个github问题,最新版本的

uuid
库已经解决了兼容性问题。


33
投票

只需将

moduleNameMapper:{"^uuid$": "uuid"}
添加到我的 jest.config.js 中即可解决我的问题:

传递依赖uuid:^8.3.2

开玩笑:28.1.3

角度:14.0.1


1
投票

升级到 uuidv4() 版本 9.0.0(“uuid”:“^9.0.0”)现在修复了该问题。 请参阅 SimenB 的评论:https://github.com/uuidjs/uuid/issues/ 451#问题评论-1377099565

我最初尝试了上面的答案,将 moduleNameMapper:{"^uuid$": "uuid"} 添加到我的 jest.config.js 中,这为我解决了问题。然后我按照上面的链接阅读更多内容,我看到它已在“uuid”中修复:“^9.0.0”。

所以我拿出了修复程序,安装了最新的 uuidv4() 版本 9.0.0(下面的包链接),它再次开始正常工作。不再出现错误,测试再次运行良好。 https://www.npmjs.com/package/uuid

我的React应用程序在更新“jest”:“26.0.1”到“jest”:“29.4.1”,“environment-jsdom-fifteen”:“1.0.2”到“jest-environment-jsdom”后开始出现问题”:“29.4.1”。以及其他更新“ts-jest”:“26.5.6”到“ts-jest”:“^29.0.5”。不过,如上所述,升级到 uuid 版本 9.0.0 已修复该问题。


0
投票

日期:2023年2月15日

笑话版本:“@types/jest”:“^29.4.0”,

UUID 版本:“uuid”:“^9.0.0”

使用

jest.config.ts
将生成一个错误,提示

发现多种配置

您可以通过以下方式覆盖它

/**
 * @format
 */

import 'react-native';
import React from 'react';
import App from '../src/App';
import {v4 as uuidv4} from 'uuid';

// Note: test renderer must be required after react-native.
import renderer from 'react-test-renderer';

it('renders correctly', () => {
  renderer.create(<App />);
});

jest.mock('uuid', () => {
  return {
    v4: jest.fn(() => 1)
  }
})

如果正确答案不适合您,希望这能解决其他人的错误:)。


0
投票

将其添加到 package.json 文件中为我解决了这个问题:

"devDependencies": {
....
},
"browser": {
    "uuid": "./node_modules/uuid/dist/esm-browser/index.js"
  }

0
投票

@damdafayton 的答案部分对我有用(谢谢),但它最终导致另一个使用

uuid
的库出现问题(在我的例子中,
mongoose
)。我认为覆盖导致
mongoose
选择错误的版本。

为了克服打地鼠游戏,我最终在我的顶级

uuid
中为
__mocks__/uuid.js
创建了一个模拟,其中包含:

const uuid = require('../node_modules/uuid/dist');
module.exports = uuid;

...这似乎可以解决问题。

可能我更具体地强制使用

uuid
的版本是为了开玩笑,而不是中断正常的解析器,但这很难确定。

© www.soinside.com 2019 - 2024. All rights reserved.