【症状】

项目配置了对模块的基于项目根目录的绝对路径引用方式,也可以正常跑起来,但是在跑测试时却碰到找不到模块的错误: shell ➜ yarn test:e2e yarn run v1.22.10 $ jest --config ./test/jest-e2e.json FAIL test/app.e2e-spec.ts ● Test suite failed to run

Cannot find module @/utils/aws.service from ../src/app-bff-module.ts

Require stack:
  /Users/path/to/your/project/src/app-bff-module.ts
  app.e2e-spec.ts

   5 |
   6 | import config from ./config/index
>  7 | import { AWSService } from @/utils/aws.service
     | ^
   8 | import { EngagementModule } from @/domains/engagement/engagement.module
   9 |
  10 | @Module({

  at Resolver.resolveModule (../node_modules/jest-resolve/build/index.js:306:11)
  at Object.<anonymous> (../src/app-bff-module.ts:7:1)

Test Suites: 1 failed, 1 total Tests: 0 total Snapshots: 0 total Time: 9.649 s Ran all test suites. error Command failed with exit code 1. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

【原因分析】

项目配置了对模块的基于项目根目录的绝对路径引用,减少了因为相对路径带来的不一致困扰。这是通过 tsconfig.json文件配置的,比如: json { compilerOptions: { ... paths: { @/: [ src/ ] } }, ... }

但是看起来 jest 跑起来时并未自动解析 tsconfig.json,通过查看 package.json中的命令可以看出,跑测试时读取了 jest-e2e.json这个文件: json { ... scripts: { ... test:e2e: jest --config ./test/jest-e2e.json, ... } ... }

于是,推测应该将基于项目根目录的绝对路径引用方式配置到 jest-e2e.json文件中。

【解决】

打开 test/jest-e2e.json文件,加入如下配置: json { ... rootDir: .., moduleNameMapper: { @/(.*): /src/$1 } ... }

注意,由于这个文件在 test目录下,所以其项目根目录的配置应该为上层目录:..。
重新运行 yarn test:e2e,成功!