Jest Iife模块测试-未定义窗口变量

时间:2019-02-05 13:40:00

标签: javascript jestjs iife

我正在为我拥有的每个单独的模块编写单元测试。这些模块之一是命令队列(以简化脚本的异步加载):

在html头中:

<script>
var advert = advert || {};
advert.cmd = advert.cmd || [];
</script>

cmd.js:

let cmd = (function(cmd) {
    const queue = cmd;

    function _init() {
        while(queue.length > 0) {
            _next();
        }
    }

    function _next() {
        queue.shift().call();
    }

    function _push(fn) {
        console.log('pushing', fn);
        if (!fn instanceof Function) {
            throw Error('core.cmd - argument not of type Function');
        }

        queue.push(fn);
        _next();
    }

    return {
        'init': _init,
        'queue': queue,
        'push': _push
    }
}(window.advert.cmd || []));

export default cmd;

对于我的单元测试,我有以下内容:

import cmd from './../src/utils/cmd';

beforeAll(() => {
    global.advert = {};
    global.advert.cmd = [];
});

describe('Given we use a queue', () => {
    let functionResult;

    beforeEach(() => {
        functionResult = 0;
    });

    describe('When the queue is initialized', () => {
        test('It should execute the already contained functions ', () => {
            global.advert.cmd = [
                function(){functionResult++},
                function(){functionResult++}
            ];

            global.advert.cmd = cmd;
            global.advert.cmd.init();

            expect(functionResult).toBe(2);
        });
    });
});

运行测试时,出现以下错误消息:

  

TypeError:无法读取未定义的属性“ cmd”

此错误指向cmd.js文件}(window.advert.cmd || []));

中的iife参数。

我首先认为这与需要重命名为global(在测试中)的window对象有关,但是即使这样也不会更改错误消息。有任何想法吗?

谢谢

1 个答案:

答案 0 :(得分:1)

创建类似prepare-environement.js的文件

global.advert = {};
global.advert.cmd = [];

并将其导入cmd.js

之前
import './prepare-environement'
import cmd from './../src/utils/cmd';