网站搜索

jestjs - TypeScript 项目中出现意外的 export 令牌 - transformIgnorePattern 问题


我有一个 TypeScript 项目,使用 Jest 进行测试,一切运行良好,使用 ts-jest 作为转换器。然而,当我尝试使用一个看起来是用 TypeScript 编写但以 ES6 形式发布的包时,我在运行测试时遇到了可怕的“Unexpected token export”错误,当测试执行到该新包的“export”关键字时就会出现这个错误。

我明白为什么会发生这种情况,但即使我已经广泛研究了这个问题,并看到其他人是如何使用 transformIgnorePatterns 解决它的(像这条帖子评论和许多其他例子),我还是无法想出如何绕过它,到目前为止我在这方面没有取得任何进展。

测试运行良好,直到我导入并引用其中一个有问题的库。只需添加:

import { Environment, EnvironmentType } from '@microsoft/sp-core-library';
...
const x: EnvironmentType = Environment.type;

...然后运行我的测试给我:

/Users/ac/_play/jest-transform-repro/node_modules/@microsoft/sp-core-library/lib/index.js:11
export { default as _BrowserDetection } from './BrowserDetection';
^^^^^^

SyntaxError: Unexpected token export

我创建了一个项目,以便可以轻松在这里重现我的问题:https://github.com/andrewconnell/jest-transform-repro

  1. 克隆 https://github.com/andrewconnell/jest-transform-repro
  2. npm 安装
  3. npm 测试

观察一切运作

  1. 打开文件 ./src/webparts/helloWorld/components/Sample/Sample.tsx 并取消注释这两行
  2. npm 测试

观察失败

我尝试过将我的 transformIgnorePatterns 更新为 <rootDir>/../node_modules/(?!(@microsoft/sp-core-library)) 以及它的不同变体,但这没有帮助。我看到过关于将 .bablerc 改为 babel.config.js 的帖子,但我在项目中没有使用 Babel,因为全部都是 TypeScript。

一旦我让这个库正常工作,我知道我需要排除更多……很多……所以理想情况下,我希望创建一些可以处理“@microsoft/*”包的东西,而不仅仅是上面列出的那个库。正如你可以从上面仓库的默认“npm install”看到的,还有很多其他包会给我带来问题。

有什么想法吗?我不知道该怎么办 :(

答案#1

这是我为了在 TS SPFX 项目下使 jest 工作而做的更改:

tsconfig.json
  • 启用 "allowJs": true,

package.json(添加 jest 配置):

    "jest": {    
    "moduleFileExtensions": [
      "ts",
      "tsx",
      "js",
      "json"
    ],

    "testURL": "http://localhost",
    "transform": {
      "^.+\\.(js|ts|tsx)$": "ts-jest"
    },
    "transformIgnorePatterns": [
      "node_modules/(?!(@microsoft/sp-dialog|@microsoft/office-ui-fabric-react-bundle|@microsoft/sp-diagnostics|@microsoft/sp-core-library|@microsoft/sp-http|@microsoft/sp-page-context|@microsoft/sp-dynamic-data|@pnp/sp|@pnp/common|@pnp/odata|@pnp))"
    ],
    "testMatch": [
      "**/src/**/*.test.+(ts|tsx|js)",
      "**/__tests__/**/*.(spec|test).+(tsx|ts|js)?(x)"
    ],
    "moduleNameMapper": {
      "\\.(css|less|scss|sass)$": "identity-obj-proxy",
      "^resx-strings/en-us.json": "<rootDir>/node_modules/@microsoft/sp-core-library/lib/resx-strings/en-us.json"
    },
  }

附加包:

  • "ts-jest": "^24.0.2",
  • "jest": "^26.6.3","jest-junit": "^12.0.0",
  • "@types/jest": "^26.0.15",
  • "identity-obj-proxy": "^3.0.0",

另一方面,我使用的是 react-testing-library 而不是 enzyme