Utilisation des alias webpack dans les tests mocha

je développe une application web au travail dans React/Redux/Webpack et je commence maintenant à intégrer des tests avec Mocha.

j'ai suivi les instructions pour écrire des tests dans la documentation Redux , mais maintenant j'ai rencontré un problème avec mes alias webpack.

par exemple, jetez un oeil à la section importations de ce test pour l'un de mes créateurs d'action:

import expect       from 'expect'                 // resolves without an issue
import * as actions from 'actions/app';           // can't resolve this alias
import * as types   from 'constants/actionTypes'; // can't resolve this alias

describe('Actions', () => {
  describe('app',() => {
    it('should create an action with a successful connection', () => {

      const host = '***************',
            port = ****,
            db = '******',
            user = '*********',
            pass = '******';

      const action = actions.createConnection(host, port, db, user, pass);

      const expectedAction = {
        type: types.CREATE_CONNECTION,
        status: 'success',
        payload: { host, port, database, username }
      };

      expect(action).toEqual(expectedAction);
    });
  });
});

comme le suggèrent les commentaires, mocha n'est pas capable de résoudre mes déclarations d'importation quand elles font référence à des dépendances aliasées.

parce que je suis encore nouveau sur webpack, voici mon webpack.config.js :

module.exports = {
  devtool: 'eval-source-map',
  entry: [
    'webpack-hot-middleware/client',
    './src/index'
  ],
  output: {
    path: path.join(__dirname, 'dist'),
    filename: 'bundle.js',
    publicPath: '/static/'
  },
  resolve: {
    extensions : ['', '.js', '.jsx'],
    alias: {
      actions: path.resolve(__dirname, 'src', 'actions'),
      constants: path.resolve(__dirname, 'src', 'constants'),
      /* more aliases */
    }
  },
  plugins: [
    new webpack.optimize.OccurenceOrderPlugin(),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NoErrorsPlugin()
  ],
  module: {
    loaders: [{
      test: /.js$/,
      loaders: ['babel'],
      exclude: /node_modules/,
      include: __dirname
    }]
  }
};

aussi, j'utilise la commande npm test pour lancer mocha, voici le script que j'utilise dans mon package.json .

 {   
   "scripts": {
     "test": "mocha ./src/**/test/spec.js --compilers js:babel-core/register --recursive"
   }
 }

donc voilà où je suis coincé. j'ai besoin d'inclure les alias de webpack dans mocha quand il s'exécute.

45
demandé sur Danny Delott 2015-11-19 04:05:45

8 réponses

Ok, donc j'ai réalisé que tout ce que j'appelais était dans le répertoire src/ , donc j'avais simplement besoin de modifier mon script npm run test .

{   
  "scripts": {
    "test": "NODE_PATH=./src mocha ./src/**/test/spec.js --compilers js:babel-core/register --recursive"
  }
}

ne marchera probablement pas pour tout le monde, mais ça a résolu mon problème.

36
répondu Danny Delott 2015-12-22 23:02:42

vous pouvez aussi utiliser un plugin babel que j'ai écrit: https://github.com/trayio/babel-plugin-webpack-alias Il convertira votre chemin aliasé en chemins relatifs simplement en incluant un plugin babel dans votre .babelrc .

14
répondu adriantoine 2016-02-23 17:10:37

j'ai aussi rencontré le même problème, mais avec ce plugin, je l'ai résolu.

https://www.npmjs.com/package/babel-plugin-webpack-aliases

la commande d'exécution de votre" mocha "ne lit pas le webpack.config.js , il ne peut donc pas résoudre l'alias.

En paramétrant ce plugin, considérez webpack.config.js lors de la compilation avec "babel-core/register". En conséquence, l'alias sera également valable lors de test.

npm i -D babel-plugin-webpack-aliases

et ajouter ce paramètre à .babelrc

{
    "plugins": [
        [ "babel-plugin-webpack-aliases", { "config": "./webpack.config.js" } ] 
    ]
}
4
répondu Yuki Hirano 2017-10-25 11:24:49

la réponse de Danny est géniale. Mais ma situation est un peu différente. J'ai utilisé le resolve.alias de webpack pour utiliser tous les fichiers du dossier src .

resolve: {
  alias: {
    '-': path.resolve(__dirname, '../src'),
  },
},

et utiliser un préfixe spécial pour mes propres modules comme celui-ci:

import App from '-/components/App';

pour tester un code comme celui-ci Je dois ajouter une commande ln -sf src test/alias/- avant le test mocha et utiliser le NODE_PATH=./test/alias truc Danny camp up avec. Donc le script final serait comme ceci:

{   
  "scripts": {
    "test": "ln -sf src test/alias/-; NODE_PATH=./test/alias mocha ./src/**/test/spec.js --compilers js:babel-core/register --recursive"
  }
}

PS:

j'ai utilisé - parce que beautifal charactors comme @ ou ~ ne sont pas assez sûres. J'ai trouvé la réponse pour les caractères sûrs ici

3
répondu Stupidism 2017-03-24 00:33:42

je pense que j'ai résolu ce problème. Vous devez utiliser 2 paquet: mock-exiger et proxyquire .

si vous avez un fichier js comme ceci:

app.js

import action1 from 'actions/youractions';   

export function foo() { console.log(action1()) }; 

et votre code de test devrait écrire comme ceci:

app.test.js

import proxyquire from 'proxyquire';
import mockrequire from 'mock-require';

before(() => {
  // mock the alias path, point to the actual path
  mockrequire('actions/youractions', 'your/actual/action/path/from/your/test/file');
  // or mock with a function
  mockrequire('actions/youractions', {actionMethod: () => {...}));

let app;
beforeEach(() => {
  app = proxyquire('./app', {});
});

//test code
describe('xxx', () => {
  it('xxxx', () => {
    ...
  });
});

file tree

app.js
  |- test
    |- app.test.js

moquez D'abord le chemin d'alias par mock-require dans la fonction before, et moquez votre objet test par proxyquire dans la fonction beforeEach.

2
répondu zhaozhiming 2015-12-14 10:03:52

j'ai eu exactement le même problème. Il semble impossible d'utiliser les alias webpack dans require.js ou dans le besoin de noeud.

j'ai finalement utilisé mock-require dans les essais unitaires et j'ai simplement remplacé les chemins manuellement, comme ceci:

var mock = require('mock-require');

mock('actions/app', '../../src/actions/app');

mock-require est un bon outil, parce que très probablement vous aimeriez mock la plupart de vos dépendances de toute façon au lieu d'utiliser les scripts actuels de src .

1
répondu Ilya Kogan 2015-11-19 09:57:10

je suppose que vous auriez --require babel-register dans votre mocha.opts . Vous pouvez utiliser babel module de résolution plugin https://github.com/tleunen/babel-plugin-module-resolver . Cela vous permet de définir des alias .babelrc, similaire à votre pseudonyme webpack:

{
  "plugins": [
    ["module-resolver", {
       "alias": {
         "actions": "./src/actions",
         "constants": "./src/constants"
       }
    }]
  ]
}
0
répondu Northern 2018-06-13 03:29:54

pour conserver les alias à un endroit comme config/webpack.common.js

resolve: {
    alias: {
        '~': path.resolve(__dirname, './../src/app')
    }
}

puis installer babel-plugin-webpack-alias

npm i babel-plugin-webpack-alias --save-dev

puis dans .babelrc :

{
    "presets": ["env"],
    "plugins": [
        ["babel-plugin-webpack-alias", {
            "config": "./config/webpack.common.js" // path to your webpack config
        }]
    ]
}
0
répondu ScorpAL 2018-09-04 15:09:57