Monorepo 中的 Jest 项目无法在项目中找到配置文件

Jest Projects in a Monorepo unable to find config files in projects

设置笑话项目时遇到问题。 项目 A 有一些项目 B 没有的额外配置 运行s(setupJest,创建一些自定义匹配器等)。当我 运行 开玩笑时,它尝试 运行:

的每个测试都会收到此错误
Test suite failed to run
File not found: <rootDir>/src/tsconfig.spec.json (resolved as: repo\src\tsconfig.spec.json)

repo 根目录中没有 src 文件夹,只有在各个项目文件夹中。我也没有在我的设置中的任何地方引用 src\tsconfig.spec.json。所以我现在对尝试什么感到有点困惑。我已经尝试将 rootDir 放在所有内容上并拼出路径,但似乎没有任何效果。非常欢迎任何建议或想法或帮助。

作为参考,repo 是 windows 驱动器上保存 repo 的文件夹。例如c:\companyName\productName\

这是我的结构

repo
  |- jest.config.js
  |- projects
       |- projectA
            |- jest.config.js
            |- tsconfig.spec.json
            |- src
                 |- setupJest.js
       |- projectB
            |- jest.config.js
            |- tsconfig.spec.json

root jest.config.js:

module.exports = {
    preset: 'jest-preset-angular',
    projects: [
        '<rootDir>/projects/projectA/jest.config.js',
        '<rootDir>/projects/projectB/jest.config.js'
    ]
    reporters: ['jest-silent-reporter'],
};

项目A jest.config.js:

module.exports = {
    globals: {
        'ts-jest': {
            tsConfig: 'tsconfig.spec.json',
            stringifyContentPathRegex: '\.html$',
            astTransformers: ['jest-preset-angular/InlineHtmlStripStylesTransformer'],
            diagnostics: false,
        },
    },
    setupFilesAfterEnv: ['src/setupJest.ts'],
};

项目 B jest.config.js:

module.exports = {
    globals: {
    'ts-jest': {
        tsConfig: 'tsconfig.spec.json',
            stringifyContentPathRegex: '\.html$',
            astTransformers: ['jest-preset-angular/InlineHtmlStripStylesTransformer'],
            diagnostics: false,
        },
    },
};

好的,所以在对 github 上报告的问题和我能找到的一些 youtube 教程进行了 4 天的深入挖掘之后,我弄糊涂了才能让它发挥作用。

root jest.config.js

globals: {
    'ts-jest': {
        astTransformers: ['jest-preset-angular/InlineHtmlStripStylesTransformer'],
        diagnostics: false,
        stringifyContentPathRegex: '\.html$',
    },
},
moduleDirectories: ['node_modules', './'],
modulePaths: ['node_modules', './'],
preset: 'ts-jest',
projects: ['projects/projectA', 'projects/projectB'],
reporters: ['jest-silent-reporter'],
testEnvironment: 'node',
transform: {
    '\.ts$': ['ts-jest'],
    '\.html$': ['ts-jest'],
},
verbose: true,

projectA/B jest.config.js

module.exports = {
globals: {
    'ts-jest': {
        astTransformers: ['jest-preset-angular/InlineHtmlStripStylesTransformer'],
        diagnostics: false,
        stringifyContentPathRegex: '\.html$',
        tsConfig: '<rootDir>/projects/projectA/tsconfig.spec.json',
    },
},
displayName: 'projectA',
moduleDirectories: ['node_modules', './'],
modulePaths: ['node_modules', './'],
name: 'projectA',
rootDir: './../../',
testMatch: ['<rootDir>/projects/projectA/**/*.spec.ts'],
transform: {
    '\.ts$': ['ts-jest'],
    '\.html$': ['ts-jest'],
},
};

事实证明,真正重要的一点是 "rootDir: './../../'" 部分。其余部分在一定程度上专门用于修复我处理这些错误时出现的其他错误,但是一旦我从子项目中正确定义了 rootDir,它实际上就开始正确地看到所有这些错误。所以这是关键。 jest.config.js(不管它在项目中的什么位置)定义相对于自身的rootDir。因此,当它到达项目文件夹并访问配置时,它重新映射了 rootDir 并迷路了。将子项目的 root 定义为与父 jest 配置相同可以解决此问题。 Jest 的文档在这一点上并不十分清楚。

jest.config.json 在每个项目中。

module.exports = {
    preset: 'ts-jest',
    globals: {
        'ts-jest': {
            tsconfig: require.resolve('./tsconfig.jest.json'),
        },
    },
};

require.resolve会找到正确的路径