在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)
我不确定如何正确解释此输出:
permission-group.service.spec.ts
:这是测试失败Cannot find module '@cm/utils-server' from 'license.service.ts'
:license.service.ts
,并且在license.service.ts
文件中找不到'@cm/utils-server'
模块。 >
处的parseLicenseInfo
是什么意思?
@cm/license-shared
-不适用于@cm/utils-server
,如2中的错误消息所示。@cm/utils-server
也已导入,但是在第14行的下面两行:那么这可能只是个玩笑吗?答案 0 :(得分:0)
现在,我们使用一种解决方法:我们在mono-repo的多个tsconfig.json文件中定义了路径。我们将所有路径都移到了root-tsconfig上,现在测试再次起作用。
但是我们真的不明白为什么会这样。
一个缺点是,现在很容易意外地引用了您不应该在lib中使用的路径(因为IDE现在始终将所有路径用于代码辅助)
答案 1 :(得分:0)
我刚遇到这个问题,并寻找了一些解决方案。找到this网站,该网站提供了有关如何执行操作的线索:配置Jest的moduleNameMapper属性。
因此,阅读documentation后,我发现了以下解决方案:
打开tsconfig.json
和jest.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
希望这可以帮助某人, 谢谢!