使用Jest和Webpack别名进行测试

时间:2017-03-06 15:51:10

标签: 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/"
    }
  },

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 docs

9 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:14)

这似乎已得到解决。

以下是工作设置:

<强>版本

"jest": "~20.0.4"

"webpack": "^3.5.6"

<强>的package.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'),
};

答案 2 :(得分:7)

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

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

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

答案 3 :(得分:1)

FWIW,尝试切换别名顺序,保持更具体的特定向下和更少的特定向下,例如

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

答案 4 :(得分:1)

没有一个规定的答案对我有用。

可以使用以下模式求解:

最佳版本25 +

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

答案 5 :(得分:0)

此解决方案对我来说效果很好:

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

答案 6 :(得分:0)

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

//...
if(EncryptPassword(enteredPwd)==encryptedSavedPwd){
//authentication
}else{
//password error
}

它不起作用。

但是当我在"jest": { "moduleNameMapper": { '@root/(.*)': '<rootDir>/../$1' } } 中执行相同操作时,它会起作用:

jest.config.js

答案 7 :(得分:0)

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

Webpack配置:

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__/*"]
    }

答案 8 :(得分:0)

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

要在 jest 中添加相同的别名,如果您的 jest 配置在 package.json 中:

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