Jestjs “开玩笑”;找不到模块";使用CI中的typescript路径

Jestjs “开玩笑”;找不到模块";使用CI中的typescript路径,jestjs,tsconfig,ts-jest,nrwl-nx,Jestjs,Tsconfig,Ts Jest,Nrwl Nx,在Gitlab CI环境2上,我们的Jest测试失败,出现找不到模块 奇怪的是,它在我本地的Win10机器上工作——即使我在类似的docker容器(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 'licen

在Gitlab CI环境2上,我们的Jest测试失败,出现
找不到模块

奇怪的是,它在我本地的Win10机器上工作——即使我在类似的docker容器(
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)
FAIL apps/server/src/domain/dashboard/permission-group.service.spec.ts
测试套件无法运行
无法从“license.service.ts”中找到模块“@cm/utils server”
9 | isLicenseFileContent,
10 |持牌人身份,
>11 |解析许可证信息
|                   ^
12 |}来自“@cm/许可共享”;
13 |从“../../util/exit code”导入{ExitCode};
14 |从'@cm/utils server'导入{readFile};
在Resolver.resolveModule(../../node_modules/jest-resolve/build/index.js:259:17)
反对。(src/domain/license/license.service.ts:11:24)
我不确定如何正确解释此输出:

  • 权限组.service.spec.ts
    :这是失败的测试
  • 无法从“license.service.ts”中找到模块“@cm/utils-server”

    好的,测试或它的一些依赖项,使用
    license.service.ts
    ,在
    license.service.ts
    文件中找不到
    “@cm/utils server”
    模块
  • 错误指示器(
    位于
    parseLicenseInfo
    )的含义是什么?
    • 这适用于导入
      @cm/license shared
      ——不适用于
      @cm/utils服务器
      ,如图2中的错误消息所示
    • @cm/utils服务器
      也被导入,但第14行下面有两行:那么这可能只是一个开玩笑的bug吗

  • 现在我们使用一种变通方法:我们在mono repo的多个tsconfig.json文件中定义了路径。我们将所有路径向上移动到根tsconfig,现在测试再次工作。
    但我们真的不明白为什么会这样


    一个缺点是,现在很容易意外地引用不应该在lib中使用的路径(因为IDE现在总是使用所有路径来提供代码帮助)

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

    因此,阅读本文,我发现了这个解决方案:

  • 打开
    tsconfig.json
    jest.config.js
    文件(或等效文件)

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

  • jest.config.json
    中,找到并取消注释
    moduleNameMapper
    属性,并开始将TS绝对路径转换为jest映射器语法。听起来很复杂,但事实并非如此:
  • 控制台输出后:

    $ jest
     PASS  src/modules/appointments/services/CreateAppointmentService.spec.ts
    
    希望这能帮助别人,
    谢谢

    有同样的问题。。。如果你找到了一个解决方案,我很想听听。@Donovan目前只有一个解决办法:我们在mono repo的多个
    tsconfig.json
    文件中定义了
    路径。我们将所有路径向上移动到根tsconfig,现在测试又开始工作了。但我们真的不明白为什么会这样。这有一个缺点,即现在很容易临时引用不应该在lib中使用的路径(因为IDE现在总是使用所有路径进行代码辅助)
    
    moduleNameMapper: {
        "@modules/(.*)": "<rootDir>/src/modules/$1",
        "@config/(.*)": "<rootDir>/src/config/$1",
        "@shared/(.*)": "<rootDir>/src/shared/$1",
    }
    
    $ 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