代码之家  ›  专栏  ›  技术社区  ›  Chris Barr

如何为Jest定义自定义TS路径?

  •  0
  • Chris Barr  · 技术社区  · 1 年前

    我有一个包含多个应用程序(Angular和NestJS)的monoreo,它们共享一些东西,如接口、枚举等。这些应用程序可以工作,Jasmine测试也可以与Angular应用程序一起工作,但我在NestJS应用程序中的Jest测试无法从共享的monoreto文件夹导入任何内容。

    这是我的文件夹结构:

    my-repo/
    ├── ng-ui-1/
    ├── ng-ui-2/
    ├── nest-api/
    │   ├── src/ (folder w/ app code)
    │   ├── tsconfig.json
    │   ├── tsconfig.build.json
    │   ├── (etc...)
    ├── monorepo-shared/
    │   ├── enums/
    │   │   ├── *.enum.ts files
    │   ├── interfaces/
    │   │   ├── *.interface.ts files
    

    在所有打字脚本应用程序中,我都将其添加到了 tsconfig.json 文件,而且它工作得很好

    {
      "compilerOptions": {
        //...
        "paths": {
          "@monorepo-shared/constants": ["../monorepo-shared/constants/index"],
          "@monorepo-shared/enums":     ["../monorepo-shared/enums/index"],
          "@monorepo-shared/interfaces":["../monorepo-shared/interfaces/index"]
        }
      }
    }
    

    在TS文件中,我可以添加它来从这些共享文件夹中导入一些东西,同样,除了Jest测试之外,这在任何地方都可以正常工作。

    import { BrandingTypeEnum } from '@monorepo-shared/enums'; 
    

    当我运行Jest测试时,我会得到这个错误

    Cannot find module '@monorepo-shared/enums' from 'account/account.controller.spec.ts'
    

    在我的 package.json 我定义了我的Jest设置。我知道我需要以某种方式指出 @monorepo-shared/enums 因为某种原因,它无法推断出这一点,但到目前为止,我所尝试的一切都不正确。

    "jest": {
      "moduleFileExtensions": [
        "js",
        "json",
        "ts"
      ],
      "moduleDirectories": [
        "node_modules",
        "@monorepo-shared/constants",
        "@monorepo-shared/enums",
        "@monorepo-shared/interfaces",
      ],
      "rootDir": "src",
      "testRegex": ".*\\.spec\\.ts$",
      "transform": {
        "^.+\\.(t|j)s$": "ts-jest"
      },
      "collectCoverageFrom": [
        "**/*.(t|j)s"
      ],
      "coverageDirectory": "../coverage",
      "testEnvironment": "node"
    },
    

    我试过很多 the solutions in this question 到目前为止,一切都不对劲。 我需要改变什么才能让Jest看到我在 tsconfig.json 文件

    1 回复  |  直到 1 年前
        1
  •  1
  •   Jay McDoniel    1 年前

    你需要使用笑话 moduleNameMapper 告诉笑话如何解决 @monorepo-shared/enums 关于 rootDir 。应该是这样的东西

    "jest": {
      "moduleFileExtensions": [
        "js",
        "json",
        "ts"
      ],
      "moduleDirectories": [
        "node_modules",
        "@monorepo-shared/constants",
        "@monorepo-shared/enums",
        "@monorepo-shared/interfaces",
      ],
      "rootDir": "src",
      "testRegex": ".*\\.spec\\.ts$",
      "transform": {
        "^.+\\.(t|j)s$": "ts-jest"
      },
      "collectCoverageFrom": [
        "**/*.(t|j)s"
      ],
      "coverageDirectory": "../coverage",
      "testEnvironment": "node",
      "moduleNameMapper": {
        "@monorepo-shared/enums": ["<rootDir>/../../monorepo-shared/enums/index"],
        "@monorepo-shared/constants": ["<rootDir>/../../monorepo-shared/constants/index"],
        "@monorepo-shared/interfaces":["<rootDir>/../../monorepo-shared/interfaces/index"]
      }
    },