使用Jest和Webpack别名进行测试

spe*_*eak 35 javascript reactjs webpack jestjs webpack-2

我希望能够在使用jest时使用webpack别名来解析导入,并且最佳地引用它webpack.aliases以避免重复.

Jest conf:

  "jest": {
    "modulePaths": ["src"],
    "moduleDirectories": ["node_modules"],
    "moduleNameMapper": {
      "^@shared$": "<rootDir>/shared/",
      "^@components$": "<rootDir>/shared/components/"
    }
  },
Run Code Online (Sandbox Code Playgroud)

Webpack别名:

exports.aliases = {
    '@shared': path.resolve(paths.APP_DIR, 'shared'),
    '@components': path.resolve(paths.APP_DIR, 'shared/components'),
};
Run Code Online (Sandbox Code Playgroud)

进口:

import Ordinal from '@shared/utils/Ordinal.jsx';
import Avatar from '@components/common/Avatar.jsx';
Run Code Online (Sandbox Code Playgroud)

由于某种原因@导致问题,所以当删除(在别名和导入中)时,它可以找到sharedcomponents仍然无法解决.

 FAIL  src/shared/components/test/Test.spec.jsx
  ? Test suite failed to run

    Cannot find module '@shared/utils/Ordinal.jsx' from 'Test.jsx'
Run Code Online (Sandbox Code Playgroud)

我尝试过使用jest-webpack-alias,babel-plugin-module-resolverJest/Webpack docs

The*_*ion 25

因为在我再次阅读之前我遇到了同样的问题,而这次更仔细的文档.正确的配置应该是:

  "jest": {
    "moduleNameMapper": {
      "^@shared(.*)$": "<rootDir>/shared$1",
      "^@components(.*)$": "<rootDir>/shared/components$1"
    }
  },
Run Code Online (Sandbox Code Playgroud)

  • 我尝试实现这个配置,但仍然有同样的问题。它找不到导入的文件:“无法从“Test.jsx”中找到模块“@shared/utils/Ordinal.jsx”。 (3认同)
  • 我必须用`"modulePaths"解决我的路径:["src"]`.然后是的,这个解决方案有效:`"^ Commons $":"./ Commons"` (2认同)

spe*_*eak 19

这似乎已得到修复.

以下是工作设置:

版本

"jest": "~20.0.4"

"webpack": "^3.5.6"

的package.json

"jest": {
  "moduleNameMapper": {
    "^@root(.*)$": "<rootDir>/src$1",
    "^@components(.*)$": "<rootDir>/src/components$1",
  } 
}
Run Code Online (Sandbox Code Playgroud)

webpack.shared.js

const paths = {
  APP_DIR: path.resolve(__dirname, '..', 'src'),
};

exports.resolveRoot = [paths.APP_DIR, 'node_modules'];

exports.aliases = {
  '@root': path.resolve(paths.APP_DIR, ''),
  '@components': path.resolve(paths.APP_DIR, 'components'),
};
Run Code Online (Sandbox Code Playgroud)

  • 请注意,配置可能位于“jest.config.js”中。 (3认同)
  • 我的问题似乎是“moduleNameMapper”仅适用于您的源代码,但不适用于您的包代码。如何在玩笑中解析node_modules中具有“@”或“@@”别名的某些包?例如包`umi`。 (2认同)

kce*_*ent 15

使用:"jest": "^26.5.3",并且"webpack": "4.41.5", 我能够将我的 webpack/typescript 别名jest.config.js与此模式正确匹配:

网络包配置:

module.exports = {
   // the rest of your config
    resolve: {
      alias: {
        'components': path.resolve(__dirname, 'js/app/components'),
        'modules': path.resolve(__dirname, 'js/app/modules'),
        'types': path.resolve(__dirname, 'js/types'),
        'hooks': path.resolve(__dirname, 'js/app/hooks'),
        'reducers': path.resolve(__dirname, 'js/app/reducers'),
        '__test-utils__': path.resolve(__dirname, 'js/app/__test-utils__') 
      }
    },
}
Run Code Online (Sandbox Code Playgroud)

Jest.config.js:

  moduleNameMapper: {
    '^types/(.*)$':  '<rootDir>/js/types/$1',
    '^components/(.*)$': '<rootDir>/js/app/components/$1',
    '^modules/(.*)$':  '<rootDir>/js/app/modules/$1',
    '^hooks/(.*)$':  '<rootDir>/js/app/hooks/$1',
    '^reducers/(.*)$':  '<rootDir>/js/app/reducers/$1',
    '^__test-utils__/(.)$': '<rootDir>/js/app/__test-utils__/$1' 
  }
Run Code Online (Sandbox Code Playgroud)

下面是对符号的解释:

  • (.*)$: 捕获精确匹配之后的任何内容(目录)
  • $1: 将它映射到我指定的目录中的这个值。

和 tsconfig.json:

    "paths": {
      "config": ["config/dev", "config/production"],
      "components/*": ["js/app/components/*"],
      "modules/*": ["js/app/modules/*"],
      "types/*": ["js/types/*"],
      "hooks/*": ["js/app/hooks/*"],
      "reducers/*": ["js/app/reducers/*"],
      "__test-utils__/*": ["js/app/__test-utils__/*"]
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果你确信你做的一切都是正确的,但 TS 仍然抱怨找不到导入:友情提醒重新启动你的 TS 服务器。 (2认同)
  • 这个答案值得更多的赞成=) (2认同)

Obe*_*ano 11

对于任何使用@asroot模块的人,您必须更具体,因为其他库可以使用@in 节点模块。

  moduleNameMapper: {
    "^@/(.*)$": "<rootDir>/src/$1"
  },
Run Code Online (Sandbox Code Playgroud)

它翻译成“任何匹配的东西都@/应该发送到<rootDir>/src/<rest of the path>


ish*_*mal 10

建议的答案都不适合我。

能够通过以下模式解决它:

笑话版本 25+

moduleNameMapper: {
    '^Screens(.*)': '<rootDir>/src/screens/$1',
    '^Components(.*)': '<rootDir>/src/components/$1',
    '^Assets(.*)': '<rootDir>/src/assets/$1',
    '^Services/(.*)': '<rootDir>/src/services/$1',
  },
Run Code Online (Sandbox Code Playgroud)


haz*_*ous 9

FWIW,尝试切换别名顺序,保持更具体的向上和不太具体的向下,例如

"moduleNameMapper": {
  "^@components$": "<rootDir>/shared/components/",
  "^@shared$": "<rootDir>/shared/"
}
Run Code Online (Sandbox Code Playgroud)


Alo*_*nad 8

这真是疯狂,但是当我尝试像这样映射 package.json 中的模块时:

"jest": {
  "moduleNameMapper": {
    '@root/(.*)': '<rootDir>/../$1'
  }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用。

但是当我做同样的事情时jest.config.js,它会起作用:

module.exports = {
   moduleNameMapper: {
     '@root/(.*)': '<rootDir>/../$1'
   }
}
Run Code Online (Sandbox Code Playgroud)