Я пишу юнит-тесты для каждого отдельного модуля, который у меня есть.Одним из этих модулей является очередь команд (для облегчения асинхронной загрузки сценария):
в заголовке 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 (в тестах), но даже это не меняет сообщение об ошибке.Есть идеи?
Спасибо