jestjs - Jest "Cannot find module"在 CI 中带有 typescript 路径

标签 jestjs tsconfig 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)

我不确定如何正确解释此输出:
  • permission-group.service.spec.ts :这是失败的测试
  • Cannot find module '@cm/utils-server' from 'license.service.ts' :
    好的,测试或者它的一些依赖,使用 license.service.ts并在 license.service.ts归档 '@cm/utils-server'找不到模块。
  • error-indicator ( > at parseLicenseInfo ) 的含义是什么?
  • 这是用于导入 @cm/license-shared - 不适用于 @cm/utils-server如 2
  • 中的错误消息所示
  • @cm/utils-server也被导入,但在第 14 行下面有 2 行:所以这可能只是一个 Jest 的错误吗?
  • 最佳答案

    我刚刚遇到了这个问题并寻找了一些解决方案。找到 this提供了可以做什么的线索的站点:配置 Jest 的 moduleNameMapper 属性。
    所以,阅读 documentation我找到了这个解决方案:

  • 打开 tsconfig.jsonjest.config.js文件(或等效文件)
  • tsconfig.json ,找到您的绝对路径定义。我的配置是这样的:
  • "paths": {
        "@modules/*": ["modules/*"],
        "@config/*": ["config/*"],
        "@shared/*": ["shared/*"]
    }
    
  • 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
    
    希望这有助于某人,
    谢谢!

    关于jestjs - Jest "Cannot find module"在 CI 中带有 typescript 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59116570/

    相关文章:

    node.js - 开 Jest - 语法错误 : Cannot use import statement outside a module with @nestjs/axios

    typescript - 用 ES6 和 Typescript 开 Jest

    typescript - Vuetify Jest 未知自定义元素 <v-*>

    typescript - 如何为 tsc 输出中的错误着色?

    typescript - 为 VSCODE 中的默认 typescript 库禁用智能感知

    jestjs - 如何测试应该抛出错误的组件?

    reactjs - 使用 enzyme 获取连接到 redux 的子组件的状态

    firebase - Jest Test - 当前环境不支持指定的持久化类型

    react-native - 使用 StyleSheet.create 失败的 Jest 测试用例