Jestjs “开玩笑”;找不到模块";使用CI中的typescript路径
在Gitlab CI环境2上,我们的Jest测试失败,出现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
找不到模块
奇怪的是,它在我本地的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