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

Я ищу, чтобы иметь возможность использовать псевдонимы 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-alias, babel-plugin-module-resolver и Jest/Webpack docs

Ответы

Ответ 1

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

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

Версии

"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

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

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

Ответ 3

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

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