Webpack单元测试以检查导出计数是否与集合中的计数匹配

Jos*_*ann 7 javascript unit-testing jasmine webpack

目前我们正在使用Jasmine进行单元测试,并且正处于将整个应用程序迁移到Webpack的开始阶段.一个挑战是我们的一些旧代码使用存在于配置中的字符串名称从窗口对象中获取函数/构造函数.因此,在我们可以完全重新考虑该代码之前的解决方法,我创建了一个应用程序范围的导出集合,并使用它来使用字符串名称来获取函数.

那就是说,我想做的是编写一个能够:

  1. 确保Webpack中的导出数与模块集合的长度相匹配.

  2. 确保我的modules集合中列出的函数名称与已导出的函数名称(不是别名,但实际函数名称)相匹配.

  3. 确保定义集合中的所有内容(当前不是问题).

下面是模块集合的截断示例,它在加载所有模块后触发事件后构建:

let _classList;
window.EventEmitter.once('modulesLoaded', () => {
    _classList = {
        'MyClass': require('./scripts/MyClass.js').default,
        'MyClass2': require('./scripts/MyClass2.js').default
    };
});

export default class modules {

    static get(name) {
        return _classList && _classList[name];
    }

    //for unit tests to ensure that all modules are available to use
    static allAreDefined() {
        if (!_classList) {
            return false;
        }
        for (var cls in _classList) {
            if (_classList.hasOwnProperty(cls)) {
                if (!_classList[cls]) {
                    return false;
                }
            }
        }
        return true;
    }

    static getLength() {
        return Object.keys(_classList).length;
    }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想编写与此类似的单元测试:

it('All in the collection are defined', function () {
   expect(modules.allAreDefined()).toBe(true);
});

//Hmm... how to do I do this?
it('Collection length matches exports length', function () {
   expect(modules.getLength() === ???.length).toBe(true);
});

//This also...?
it('The collection includes an entry for every export', function () {
    expect(
        (function() {
            for(let i = 0; i < ???.length; i++) {
                if(!modules.get(???[i].name)) {
                    return false;
                };
            }
            return true;
        }())
    ).toBe(true);
});
Run Code Online (Sandbox Code Playgroud)