我曾经在仅使用 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)$"]
}
感谢您的回复: 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
库已经解决了兼容性问题。
只需将
moduleNameMapper:{"^uuid$": "uuid"}
添加到我的 jest.config.js 中即可解决我的问题:
传递依赖uuid:^8.3.2
开玩笑:28.1.3
角度:14.0.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 已修复该问题。
日期: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)
}
})
如果正确答案不适合您,希望这能解决其他人的错误:)。
将其添加到 package.json 文件中为我解决了这个问题:
"devDependencies": {
....
},
"browser": {
"uuid": "./node_modules/uuid/dist/esm-browser/index.js"
}
@damdafayton 的答案部分对我有用(谢谢),但它最终导致另一个使用
uuid
的库出现问题(在我的例子中,mongoose
)。我认为覆盖导致 mongoose
选择错误的版本。
为了克服打地鼠游戏,我最终在我的顶级
uuid
中为 __mocks__/uuid.js
创建了一个模拟,其中包含:
const uuid = require('../node_modules/uuid/dist');
module.exports = uuid;
...这似乎可以解决问题。
可能我更具体地强制使用
uuid
的版本是为了开玩笑,而不是中断正常的解析器,但这很难确定。