在mocha测试中使用webpack别名

Dan*_*ott 50 mocha.js npm reactjs webpack redux

我正在开发一个在React/Redux/Webpack中工作的Web应用程序,现在我开始将测试与Mocha集成.

我按照Redux文档中的编写测试说明进行操作,但现在我遇到了webpack别名的问题.

例如,请查看我的一个动作创建者的此测试的导入部分:

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);
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

正如评论所示,mocha在引用别名依赖项时无法解析我的import语句.

因为我还是webpack的新手,这是我的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
    }]
  }
};
Run Code Online (Sandbox Code Playgroud)

另外,我正在使用命令npm test运行mocha,这是我正在使用的脚本package.json.

 {   
   "scripts": {
     "test": "mocha ./src/**/test/spec.js --compilers js:babel-core/register --recursive"
   }
 }
Run Code Online (Sandbox Code Playgroud)

所以这就是我被卡住的地方.我需要在运行时将webpack中的别名包含到mocha中.

Dan*_*ott 37

好的,所以我意识到我所有的别名都在src/目录中,所以我只需要修改我的npm run test脚本.

{   
  "scripts": {
    "test": "NODE_PATH=./src mocha ./src/**/test/spec.js --compilers js:babel-core/register --recursive"
  }
}
Run Code Online (Sandbox Code Playgroud)

可能不适合所有人,但这解决了我的问题.


adr*_*ine 15

您还可以使用我创作的babel插件:https: //github.com/trayio/babel-plugin-webpack-alias 它会将您的别名路径转换为相对路径,只需将babel插件包含在您的.babelrc.

  • 我不是在生产中使用它,但我现在正在开发它.它似乎与预期完全一样.我是别名的粉丝,我认为使用babel-plugin解决这个问题是可行的方法.我没有看过源或任何东西,但到目前为止工作正常. (4认同)

Yuk*_*ano 5

我也遇到了同样的问题,但是使用此插件,我解决了它。

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

您的“ mocha”的执行命令未读取webpack.config.js,因此无法解析别名。
通过设置此插件,请webpack.config.js在使用“ babel-core / register”进行编译时考虑。结果,别名在测试期间也将有效。

npm i -D babel-plugin-webpack-aliases
Run Code Online (Sandbox Code Playgroud)

并将此设置添加到 .babelrc

{
    "plugins": [
        [ "babel-plugin-webpack-aliases", { "config": "./webpack.config.js" } ] 
    ]
}
Run Code Online (Sandbox Code Playgroud)