运行 Jest 测试出现错误“无法在模块外部使用 import 语句”

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

在我的node.js(带有打字稿)项目中,我尝试使用 crypto-random-string 包来生成随机字符串值。

我使用pnpm安装了它:

pnpm i crypto-random-string

在我的生产代码中,我将其用作:

import cryptoRandomString from 'crypto-random-string';

const cryptoStr = () => cryptoRandomString({ length: 10, type: 'ascii-printable' });

我有一个笑话代码来对其进行单元测试,但是当运行笑话时,它会抱怨:

my-project/node_modules/.pnpm/[email protected]/node_modules/crypto-random-string/index.js:3
    import {promisify} from 'node:util';
    ^^^^^^

    SyntaxError: Cannot use import statement outside a module

    > 1 | import cryptoRandomString from 'crypto-random-string';

我的

jest.config.ts

export default {
  jest: {
    preset: 'ts-jest',
    testEnvironment: 'node',
    transform: {
      'node_modules/variables/.+\\.(j|t)sx?$': 'ts-jest',
    },
    transformIgnorePatterns: ['node_modules/(?!variables/.*)'],
  },
};

我尝试了here的解决方案,但对我没有帮助。

如何解决这个问题?

node.js typescript jestjs ts-jest
3个回答
1
投票

改编here的答案在我的

jest.config.js
中对我有用。具体来说:

module.exports = {
  transformIgnorePatterns: ['/node_modules\/(?!crypto-random-string)(.*)']
}

0
投票

对于那些仍然受此困扰的人 - 我发现这个答案有帮助:https://stackoverflow.com/a/64223627/1282432

使用 babel for Jest + Babel.config.js + 转换 + transformIgnorePatterns 来忽略加密随机字符串

这些都是需要的


-1
投票

你需要使用babel。 在服务器package.json中:

  "devDependencies": {
  "@babel/preset-env": "^7.16.11"    
  "babel-jest": "^27.5.1",
  "jest": "^27.5.1",
  },

  "babel": {
    "presets": [
      [
        "@babel/preset-env",
        {
          "targets": {
            "node": "current"
          }
        }
      ]
    ]
  }

还有客户端package.json:

  "devDependencies": {
    "@babel/preset-env": "^7.16.11",
    "@babel/preset-react": "^7.16.7",
    "jest": "^27.5.1",
    "jest-babel": "^1.0.1",
    "parcel": "^2.3.2"
  },
  "babel": {
    "presets": [
      "@babel/preset-react",
      [
        "@babel/preset-env",
        {
          "targets": {
            "node": "current"
          }
        }
      ]
    ]
  }

如果不行的话,能否提供一下测试文件?

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