Тестирование с псевдонимами Jest и Webpack

Я ищу возможность использовать псевдонимы webpack для разрешения импорта при использовании jest и оптимально ссылаться на 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-псевдоним, babel-плагин-модуль-решатель и Jest / Webpack docs

3 ответов


Так как у меня была та же проблема, прежде чем я прочитал снова, и на этот раз более тщательно документацию. Правильный конфиг должен быть:

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

кажется, это исправлено.

Ниже приведена рабочая настройка:

версии

"jest": "~20.0.4"

"webpack": "^3.5.6"

пакета.в JSON

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

webpack.общий.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'),
};

FWIW, попробуйте переключить порядок псевдонимов, держите более конкретный вверх и менее конкретный вниз, например

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