reactjs - استخدام الأسماء المستعارة لـ webpack في اختبارات mocha




npm redux (7)

أنا طور تطبيق ويب في العمل في React / Redux / Webpack وأنا الآن بدأت في دمج الاختبار مع Mocha.

لقد اتبعت التعليمات الخاصة بكتابة الاختبارات في وثائق Redux ، لكنني الآن واجهت مشكلة في الأسماء المستعارة لحزم الويب.

على سبيل المثال ، ألق نظرة على قسم الواردات من هذا الاختبار لأحد منشئي الدعوات:

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);
    });
  });
});

وكما تشير التعليقات ، فإن mocha غير قادر على حل عبارات الاستيراد عند الإشارة إلى تبعيات مستعارة.

نظرًا لأنني لا زلت جديدًا في 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
    }]
  }
};

أيضا ، أنا باستخدام npm test الأمر npm test لتشغيل mocha ، وهنا البرنامج النصي الذي أستخدمه في package.json بي.

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

لذلك هنا أجد نفسي عالقا. أحتاج إلى تضمين الأسماء المستعارة من webpack إلى المخاوي عند تشغيله.


Answers

حسنا لذلك أدركت أن كل شيء كنت مستعارًا كان في src/ directory ، لذا فأنا بحاجة ببساطة إلى تعديل البرنامج النصي npm run test .

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

ربما لن تعمل من أجل الجميع ، ولكن هذا حل مشكلتي.


أفترض أن لديك --require babel-register في mocha.opts الخاص بك. يمكنك استخدام المساعد بابل وحدة المساعد https://github.com/tleunen/babel-plugin-module-resolver . يتيح لك هذا تعيين اسم مستعار في .babelrc ، على غرار الاسم المستعار لـ Facebook:

{
  "plugins": [
    ["module-resolver", {
       "alias": {
         "actions": "./src/actions",
         "constants": "./src/constants"
       }
    }]
  ]
}

إجابة داني رائعة. لكن موقفي مختلف بعض الشيء. اعتدت عزيزي webpack's لاستخدام جميع الملفات تحت مجلد src .

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

واستخدم بادئة خاصة لوحداتي الخاصة مثل:

import App from '-/components/App';

لاختبار مثل هذا الكود يجب إضافة أمر ln -sf src test/alias/- قبل اختبار mocha واستخدام NODE_PATH=./test/alias خدعة معسكر داني. لذا فإن النص النهائي سيكون هكذا:

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

PS:

اعتدت - لأن الشخصيات الجميلة مثل @ أو ~ ليست آمنة بما فيه الكفاية. لقد وجدت الإجابة عن شخصيات آمنة here


يمكنك أيضًا استخدام ملحق babel الذي قمت بتأليفه: https://github.com/trayio/babel-plugin-webpack-alias سيقوم بتحويل المسار المستعار الخاص بك إلى المسارات النسبية فقط عن طريق تضمين ملحق بابل إلى .babelrc الخاص بك.


أعتقد أنني حلت هذه المشكلة. يجب عليك استخدام حزمة 2: mock-require و proxyquire .

إذا افترضنا أن لديك ملف js مثل هذا:

app.js

import action1 from 'actions/youractions';   

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

ويجب أن يكتب رمز الاختبار على النحو التالي:

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', () => {
    ...
  });
});

شجرة الملفات

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

قم أولاً بالتهزئة بمسار الاسم المستعار من خلال طلب وهمية في ما قبل الدالة ، واستهزأ بجهاز الاختبار عن طريق proxyquire في beforeEach function.


كما واجهت نفس المشكلة ، ولكن مع هذا البرنامج المساعد أنا حلها.

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

وأضف هذا الإعداد إلى .babelrc

{
    "plugins": [
        [ "babel-plugin-webpack-aliases", { "config": "./webpack.config.js" } ] 
    ]
}

كان لدي مشاكل في الحصول على event.stopPropagation() العمل. إذا قمت بذلك أيضًا ، فحاول نقله إلى أعلى وظيفة معالج النقرات الخاص بك ، وهذا ما كنت بحاجة إلى فعله لمنع الحدث من الظهور. مثال وظيفة:

  toggleFilter(e) {
    e.stopPropagation(); // If moved to the end of the function, will not work
    let target = e.target;
    let i = 10; // Sanity breaker

    while(true) {
      if (--i === 0) { return; }
      if (target.classList.contains("filter")) {
        target.classList.toggle("active");
        break;
      }
      target = target.parentNode;
    }
  }




reactjs npm mocha webpack redux