Javascript 使用全局变量的摩卡测试(和巴别塔)

Javascript 使用全局变量的摩卡测试(和巴别塔),javascript,node.js,npm,mocha.js,babeljs,Javascript,Node.js,Npm,Mocha.js,Babeljs,我正在使用es6编写库,通过webpack和npm与babel进行传输。 问题是,我的库依赖于一些代码,我不能更改它们,但需要使用它们。我不知道如何在我的测试中加载var stuff(来自下面的示例),以便它对模块可见 请参见示例: external stuff.js-此文件无法更改,并在将我的库加载到prod env之前加载 var stuff = { get some() { return "some"; } get stuff() { return "stuff"; }

我正在使用es6编写库,通过webpack和npm与babel进行传输。 问题是,我的库依赖于一些代码,我不能更改它们,但需要使用它们。我不知道如何在我的测试中加载var stuff(来自下面的示例),以便它对模块可见

请参见示例:

external stuff.js-此文件无法更改,并在将我的库加载到prod env之前加载

var stuff = {
    get some()  { return "some"; }
    get stuff() { return "stuff"; }
}
some module.js-这是库中的模块之一

export class foo {
    static get whatever() { return stuff.some; }
    static get whichever() { return stuff.stuff; }
}
测试

import {foo} from "../src/foo.js";

let assert = require('assert');

describe('foo', function() {
    describe('#whatever()', function() {
        it("should do some", function () {
            assert.equals(foo.whatever(), "some");
        });
    });
});
如果我运行这个,我会得到“ReferenceError:stuff未定义”


我已经尝试在before()hook中定义“stuff”,但没有成功。

最后我找到了一个“足够好”的解决方案。不过,我不确定这对一些高级图书馆来说是否足够

我已经创建了名为globals.js的文件

var g = typeof(window) === 'undefined' ? global : window;

// Dependencies - add as many global stuff as needed
g.stuff= typeof(stuff) === 'undefined' ? {} : stuff;
我在测试开始时导入这个“es6module”

import * as globals from "../lib/global/globals"
import {foo} from "../src/foo.js";
然后我使用npm模块,在每个钩子之前,我将全局加载到测试中

beforeEach(function () {
    global.stuff = imports.module("lib/global/stuff.js").stuff;
});
这对于单元测试是完美的,因为我也可以模拟东西。它甚至更棒,因为这样我就有了一个“定义”全局依赖关系的地方。这将是很好的改善,使它每es6modul依赖。。。在它的基础上做些新奇的事情。。。你知道。。依赖注入

完整测试

require('node-import'); // +

import * as globals from "../lib/global/globals";  // +
import {foo} from "../src/foo.js";

let assert = require('assert');

describe('foo', function() {
    beforeEach(function () {  // +
        global.stuff = imports.module("lib/global/stuff.js").stuff;  // +
    });  // +

    describe('#whatever()', function() {
        it("should do some", function () {
            assert.equals(foo.whatever(), "some");
        });
    });
});

您是否将
stuff
从external-stuff.js导入some-module.js?我没有看到任何进口商品,所以我是asking@ArpitSolanki不,我没有,因为正如您所注意到的,stuff.js不是es6模块,它只是一个全局变量。这个全局模块是如何加载的?你能告诉我吗?@arpitolanki事实上,它很难包含在使用rhino进行js解析的java模块中,我们只是将生成的Transpile库加载到其中。