Sinon, тестовый пример Chai с несколькими вложенными функциями

Я попытался загрузить несколько внешних js, используя javascript. У меня был отдельный код для логики инъекций. Когда я загружаю один файл js, это означает, что тестовый пример работает нормально. Но когда я пытаюсь загрузить несколько файлов js, тестовый пример FAILED.

Main.js

var externalJs = "abcd.js";
function loadJs() {
  window.$script(externalJs);
}
function init(domElement) {
  loadJs();
}

module.exports = {
  init: init
};

Test.js

/* global assert, sinon*/
describe('Test', function () {
  var factory = require('main.js');
  it('oad the correct js library', function(){
    window.$script = sinon.spy();
    factory.init();
    sinon.assert.calledOnce(window.$script);

  });
});

Приведенный выше код работает нормально. Но когда я пытаюсь загрузить несколько внешних файлов, тестовый пример не удался.

Main.js

var externalJs = [ "abcd.js", "xyz.js"];

function loadJs() {
  window.$script(externalJs[0], function(){
    window.$script(externalJs[1], function(){
    });
  });
}

function init(domElement) {
  loadJs();
}

module.exports = {
  init: init
};

Test.js

/* global assert, sinon*/

describe('Test', function () {
  var factory = require('main.js');
  it('oad the correct js library', function(){
    window.$script = sinon.spy();
    factory.init();
    sinon.assert.calledTwice(window.$script);
  });
});

Сведения об ошибке:

expected $script to be called twice but was called once

Есть идеи, как решить эту проблему.


person RSKMR    schedule 06.11.2017    source источник
comment
Если есть реальные сетевые запросы на получение скриптов, вам нужно добавить callback done() к вашей it-функции, чтобы тест дождался загрузки скриптов. Затем, когда сценарии загружены, вызов выполнен в тесте   -  person William    schedule 06.11.2017


Ответы (1)


Проблема в том, что первый вызов window.$script не вызывает функцию обратного вызова, которая предоставляется в качестве параметра (в данном случае еще один вызов window.$script).

Вместо того, чтобы использовать синон-шпион, попробуйте использовать заглушку. С помощью заглушки вы можете указать sinon автоматически вызывать любые параметры функции, которые он получает.

window.$script = sinon.stub();

// configure the stub to automatically call any callbacks supplied
window.$script.yields();
person Alex    schedule 08.11.2017