在CI中带有打字稿路径的玩笑“找不到模块”

时间:2019-11-30 13:22:51

标签: jestjs tsconfig ts-jest nrwl-nx

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

这是控制台输出:

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)

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

  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. 错误指示符(>处的parseLicenseInfo是什么意思?
    • 这用于导入@cm/license-shared-不适用于@cm/utils-server,如2中的错误消息所示。
    • @cm/utils-server也已导入,但是在第14行的下面两行:那么这可能只是个玩笑吗?

2 个答案:

答案 0 :(得分:0)

现在,我们使用一种解决方法:我们在mono-repo的多个tsconfig.json文件中定义了路径。我们将所有路径都移到了root-tsconfig上,现在测试再次起作用。
但是我们真的不明白为什么会这样。

一个缺点是,现在很容易意外地引用了您不应该在lib中使用的路径(因为IDE现在始终将所有路径用于代码辅助)

答案 1 :(得分:0)

我刚遇到这个问题,并寻找了一些解决方案。找到this网站,该网站提供了有关如何执行操作的线索:配置Jest的moduleNameMapper属性。

因此,阅读documentation后,我发现了以下解决方案:

  1. 打开tsconfig.jsonjest.config.js文件(或等效文件)

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

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

这样做之后,我能够毫无问题地执行测试。

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

$ jest
 FAIL  src/modules/appointments/services/CreateAppointmentService.spec.ts
  ● Test suite failed to run

    Cannot find module '...'

之后的控制台输出

$ jest
 PASS  src/modules/appointments/services/CreateAppointmentService.spec.ts

希望这可以帮助某人, 谢谢!