Тестирование модуля Jest iife - переменная окна не определена - PullRequest
0 голосов
/ 05 февраля 2019

Я пишу юнит-тесты для каждого отдельного модуля, который у меня есть.Одним из этих модулей является очередь команд (для облегчения асинхронной загрузки сценария):

в заголовке 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' из неопределенного

Эта ошибка указывает на аргумент iife в файле cmd.js: }(window.advert.cmd || []));

Сначала я подумал, что это связано с объектом окна, который необходимо переименовать в global (в тестах), но даже это не меняет сообщение об ошибке.Есть идеи?

Спасибо

1 Ответ

0 голосов
/ 05 февраля 2019

Создайте файл наподобие prepare-environement.js

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

и импортируйте его до cmd.js

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