在 CI 中使用打字稿路径开玩笑“找不到模块”

TmT*_*ron 5 tsconfig jestjs ts-jest nrwl-nx

在 Gitlab-CI 环境 2 中,我们的 Jest 测试以Cannot find module.
奇怪的是它可以在我本地的 Win10 机器上运行——即使我在类似的 docker-container ( node 12.12.0) 中运行测试。

这是控制台输出:

FAIL apps/server/src/domain/dashboard/permission-group.service.spec.ts
Test suite failed to run
  Cannot find module '@cm/utils-server' from 'license.service.ts'
     9 |   isLicenseFileContent,
    10 |   LicenseStatus,
  > 11 |   parseLicenseInfo
       |                   ^
    12 | } from '@cm/license-shared';
    13 | import { ExitCode } from '../../util/exit-codes';
    14 | import { readFile } from '@cm/utils-server';
    at Resolver.resolveModule (../../node_modules/jest-resolve/build/index.js:259:17)
    at Object.<anonymous> (src/domain/license/license.service.ts:11:24)
Run Code Online (Sandbox Code Playgroud)

我不确定如何正确解释此输出:

  1. permission-group.service.spec.ts: 这是失败的测试
  2. Cannot find module '@cm/utils-server' from 'license.service.ts':
    好的,测试或者它的一些依赖,使用license.service.ts并且在license.service.ts文件'@cm/utils-server'中找不到模块。
  3. 错误指示符 ( >at parseLicenseInfo)的含义是什么?
    • 这是用于导入@cm/license-shared- 不是用于@cm/utils-server2 中的错误消息所指示的
    • @cm/utils-server 也被导入,但在第 14 行下面有 2 行:所以这可能只是一个玩笑的错误吗?

小智 14

我刚刚遇到这个问题并寻找一些解决方案。找到这个网站,它提供了有关可以做什么的线索:配置 Jest\ 的 moduleNameMapper 属性。

\n

因此,阅读文档我找到了这个解决方案:

\n
    \n
  1. 打开tsconfig.jsonjest.config.js文件(或同等文件)

    \n
  2. \n
  3. 在 中tsconfig.json,找到您的绝对路径定义。我的配置如下:

    \n
  4. \n
\n
"paths": {\n    "@modules/*": ["modules/*"],\n    "@config/*": ["config/*"],\n    "@shared/*": ["shared/*"]\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 在 中jest.config.json,找到并取消注释该moduleNameMapper属性,然后开始将 TS 绝对路径转换为 ​​Jest 映射器语法。听起来很复杂,但事实并非如此:
  2. \n
\n
moduleNameMapper: {\n    "@modules/(.*)": "<rootDir>/src/modules/$1",\n    "@config/(.*)": "<rootDir>/src/config/$1",\n    "@shared/(.*)": "<rootDir>/src/shared/$1",\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • if<rootDir>自动定义,并指向package.json目录
  • \n
  • "@modules/(.*)"是“以 \'@module/\' 开头的任何字符串,后跟其后的任何内容的正则表达式
  • \n
  • "<rootDir>/src/modules/$1"是对应的目录。$1是指向括号 () 之间的 Regex 表达式的指针(.*)$2其他表达式将由,指向,$3依此类推
  • \n
\n

完成此操作后,我能够毫无问题地执行测试。

\n

在执行上述步骤之前控制台输出:

\n
$ jest\n FAIL  src/modules/appointments/services/CreateAppointmentService.spec.ts\n  \xe2\x97\x8f Test suite failed to run\n\n    Cannot find module \'...\'\n
Run Code Online (Sandbox Code Playgroud)\n

之后控制台输出:

\n
$ jest\n PASS  src/modules/appointments/services/CreateAppointmentService.spec.ts\n
Run Code Online (Sandbox Code Playgroud)\n

希望这对某人有帮助,\n谢谢!

\n

  • 可以通过 ts-jest/utils 中的 pathsToModuleNameMapper() 方法来简化。https://kulshekhar.github.io/ts-jest/docs/getting-started/paths-mapping/ 在这种情况下,前缀应设置为 &lt;rootDir&gt;/src (2认同)

TmT*_*ron 0

现在我们使用一个解决方法:我们在 mono-repo 的多个 tsconfig.json 文件中定义了路径。我们将所有路径移至 root-tsconfig,现在测试再次正常工作。
但我们并不真正理解为什么会这样。

缺点是现在很容易意外引用库中不应使用的路径(因为 IDE 现在始终使用所有路径进行代码辅助)