繁体   English   中英

使用 Jest 和 Webpack 别名进行测试

[英]Testing with Jest and Webpack aliases

我希望能够在使用 jest 时使用 webpack 别名来解析导入,并且最好参考webpack.aliases以避免重复。

开玩笑的:

  "jest": {
    "modulePaths": ["src"],
    "moduleDirectories": ["node_modules"],
    "moduleNameMapper": {
      "^@shared$": "<rootDir>/shared/",
      "^@components$": "<rootDir>/shared/components/"
    }
  },

Webpack 别名:

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

进口:

import Ordinal from '@shared/utils/Ordinal.jsx';
import Avatar from '@components/common/Avatar.jsx';

出于某种原因, @会导致问题,因此在删除时(在别名和导入中),它可以找到shared但仍然无法解析components

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

    Cannot find module '@shared/utils/Ordinal.jsx' from 'Test.jsx'

我尝试使用jest-webpack-aliasbabel-plugin-module-resolverJest/Webpack 文档

这似乎已经修复。

下面是一个工作设置:

版本

"jest": "~20.0.4"

"webpack": "^3.5.6"

包.json

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

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'),
};

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

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

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

网络包配置:

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__') 
      }
    },
}

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' 
  }

下面是对符号的解释:

  • (.*)$ :捕获完全匹配之后的任何内容(目录)
  • $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__/*"]
    }

对于使用@作为其模块root的任何人,您必须更加具体,因为其他库可以在节点模块中使用@

  moduleNameMapper: {
    "^@/(.*)$": "<rootDir>/src/$1"
  },

它转换为“任何与@/匹配的东西都应该发送到<rootDir>/src/<rest of the path>

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

"moduleNameMapper": {
  "^@components$": "<rootDir>/shared/components/",
  "^@shared$": "<rootDir>/shared/"
}

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

"jest": {
  "moduleNameMapper": {
    '@root/(.*)': '<rootDir>/../$1'
  }
}

它不起作用。

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

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

建议的答案都不适合我。

能够使用以下模式解决它:

开玩笑版 25+

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

这个解决方案对我很有效:

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

假设您的 webpack 别名位于“resolved_pa​​ths”块中的 webpack.yml 中。

要在 jest 中添加相同的别名,如果您的 jest 配置位于 package.json 中,请使用moduleDirectories

 "jest":{ "moduleDirectories":[ ".", "<rootDir>/shared/components/", "<rootDir>/shared/", "node_modules" ] }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM