可以在Mocha测试中使用ES6模块吗?

时间:2017-09-29 10:51:29

标签: javascript node.js ecmascript-6 mocha

ES6,Windows 10 x64,Node.js 8.6.0,Mocha 3.5.3

是否可以在Mocha测试中使用ES6模块?我对exportimport个关键字存在问题。

/* eventEmitter.js
 */

/* Event emitter. */
export default class EventEmitter{

    constructor(){

        const subscriptions = new Map();

        Object.defineProperty(this, 'subscriptions', {
            enumerable: false,
            configurable: false,
            get: function(){
                return subscriptions;
            }
        });
    }

    /* Add the event listener.
     * @eventName - the event name. 
     * @listener - the listener.
     */
    addListener(eventName, listener){
        if(!eventName || !listener) return false;
        else{
            if(this.subscriptions.has(eventName)){
                const arr = this.subscriptions.get(eventName);
                arr.push(listener);
            }
            else{
                const arr = [listener];
                this.subscriptions.set(eventName, arr);
            }
            return true;
        }
    }

    /* Delete the event listener.
     * @eventName - the event name. 
     * @listener - the listener.
     */
    deleteListener(eventName, listener){
        if(!eventName || !listener) return false;
        else{
            if(this.subscriptions.has(eventName)){
                const arr = this.subscriptions.get(eventName);
                let index = arr.indexOf(listener);

                if(index >= 0){
                    arr.splice(index, 1);
                    return true;
                }
                else{
                    return false;
                }
            }
            else{
                return false;
            }
        }
    }

    /* Emit the event.
     * @eventName - the event name. 
     * @info - the event argument.
     */
    emit(eventName, info){
        if(!eventName || !this.subscriptions.has(eventName)) {
            return false;
        }
        else{
            for(let fn of this.subscriptions.get(eventName)){
                if(fn) fn(info);
            }
            return true;
        }
    }
}

摩卡测试:

/* test.js 
 * Mocha tests.
 */
import EventEmitter from '../../src/js/eventEmitter.js';

const assert = require('assert');

describe('EventEmitter', function() {
  describe('#constructor()', function() {
    it('should work.', function() {
        const em = new EventEmitter();
        assert.equal(true, Boolean(em));
    });
  });
});

我直接通过PowerShell控制台启动mocha。结果:

enter image description here

3 个答案:

答案 0 :(得分:13)

Mocha的support for ESM从7.1.0版开始(发布:2020年2月26日)。

这需要Node 12.11.0或更高版本,并且受当前在Node中使用模块的限制/限制:

  • 对于使用ES模块的源文件,必须使用.mjs文件扩展名,或者在package.json中必须包含"type": "module"
  • 从CommonJS模块进行import时,您不能使用命名导入

以此类推。

另一种选择是使用esm程序包,该程序包不受上述限制:

mocha -r esm

到目前为止,我个人的经验是,尝试利用Mocha固有的新ESM支持仍然是一个沉重的负担,但是使用esm软件包却是无缝的。

答案 1 :(得分:1)

答案 2 :(得分:1)

在我的情况下运行:

基本命令:

npx mocha --require esm test_path/

package.json

"scripts": {
    // ...
    "test": "npx mocha --require esm --reporter spec test_path/"
}

运行

npm test