Mocha sinon.spy всегда показывает вызов функции 0 раз

Я новичок в мокко / чае. Я пытаюсь написать модульный тестовый пример для следующего сценария. Я хочу проверить, вызываются ли «callchildfunc» и «childfunc2» или нет при вызове функции «parent()».

Я прочитал основы и понял, что если вы шпионите за какой-либо функцией, просто поставьте assert для этой функции, чтобы проверить, вызывается ли эта функция или нет. Средства в приведенном выше файле сценария. Если я буду следить за функциями «childfunc2» и «callchildfunc», то мне не нужно вызывать здесь тестовый файл, поскольку он уже вызывается в файле сценария в родительской функции. Пожалуйста, поправьте мое понимание, если я ошибаюсь.

Это мой файл script.js

// script.js    

function childfunc2(){
    console.log("child function without return");
}
function callchildfunc(var1, var2){
   return var1 + var2;
}
function parent(x){
   var getreturnval = callchildfunc(x, 1);
   console.log(getreturnval);
   childfunc2();
}

Это мой тестовый файл.

//scenario 1

describe('Test for parent() function ', function(){
   it('should make parent call ', function(){

        var spy1 = sinon.spy(window, 'callchildfunc');
        var spy2 = sinon.spy(window, 'childfunc2');
        parent(2);
        expect(spy1).to.have.been.called();
        expect(spy2).to.have.been.called();
        // or
        sinon.assert.calledOnce(spy1);
        sinon.assert.calledOnce(spy1);

    });
});

После запуска теста всегда я получаю эту ошибку.

AssertError: expected childfunc2 to be called once but was called 0 times

Также, если я изменю тестовый файл и вызову шпионскую функцию, она будет работать.

var spy1 = sinon.spy(window, 'callchildfunc');
var spy2 = sinon.spy(window, 'childfunc2');
parent(2);
// After addding these below 2 lines.
window.childfunc2();
window.callchildfunc();

Любая помощь?


person Henry    schedule 21.03.2018    source источник
comment
В какой среде вы проводите этот тест?   -  person Lennholm    schedule 21.03.2018
comment
Я тестирую в локальной среде @ Mikael Lennholm   -  person Henry    schedule 21.03.2018
comment
Вы запускаете его в браузере или в среде выполнения NodeJS?   -  person Lennholm    schedule 21.03.2018
comment
Я запускаю из командной строки. Это тестирование внешнего интерфейса. @Микаэль Леннхольм   -  person Henry    schedule 21.03.2018
comment
Хорошо, тогда вы используете какой-то веб-драйвер? Какую команду вы выполняете? Если это npm test, что выполняет скрипт test в package.json?   -  person Lennholm    schedule 22.03.2018
comment
@MikaelLennholm Я использую веб-пакет и с помощью grunt запускаю эту команду. хрюкающий тест: ед. Да, я бегу через ворчание.   -  person Henry    schedule 22.03.2018
comment
Поскольку вы не запускаете его в браузере, я ожидаю, что вы получите сообщение об ошибке ReferenceError: window is not defined. Тот факт, что вы получаете другую ошибку, меня смущает. Я думаю, вам нужно добавить больше информации о вашей настройке, но я не уверен, что смогу вам помочь, извините.   -  person Lennholm    schedule 23.03.2018
comment
Как говорит @MikaelLennholm, вы должны получить ошибку «Ошибка ссылки: окно не определено». Экспортируйте файл сценария в модуль, затребуйте его в модульном тесте и передайте имя модуля вместо окна.   -  person user2347763    schedule 26.03.2018
comment
@ Генри Пожалуйста, обратитесь к ответу для решения   -  person user2347763    schedule 26.03.2018
comment
@MikaelLennholm: извините за это. Объект Window я назначаю рассматривать как глобальный уровень.   -  person Henry    schedule 28.03.2018
comment
@rjv: Извини, чувак. Я забыл добавить лайк из файла script.js. Я экспортирую вот так, и это не работает. module.exports = новые тестовые функции(); function testFunctions() {childfunc2: childfunc2, callchildfunc: callchildfunc, parent: parent}   -  person Henry    schedule 28.03.2018


Ответы (1)


// Script.js 

module.exports= {
childfunc2:function(){
    console.log("child function without return");
},
callchildfunc:function(var1, var2){
   return var1 + var2;
},
parent:function(x){
   var getreturnval = this.callchildfunc(x, 1);
   console.log(getreturnval);
   this.childfunc2();
}
};

// Тест.js

var sinon= require('sinon'), expect=require('chai').expect
var r= require('./functests')
describe('Test for parent() function ', function(){
   it('should make parent call ', function(){
        var spy1 = sinon.spy(r, 'callchildfunc');
        var spy2 = sinon.spy(r, 'childfunc2');
        r.parent(2);
//        expect(spy1).to.have.been.called();
  //      expect(spy2).to.have.been.called();
        // or
        sinon.assert.calledOnce(spy1);
        sinon.assert.calledOnce(spy1);

    });
});

// Скриншот

введите здесь описание изображения

person user2347763    schedule 26.03.2018
comment
Извини чувак. Я забыл добавить лайк из файла script.js. Я экспортирую вот так, и это не работает. module.exports = новые тестовые функции(); function testFunctions() {childfunc2: childfunc2, callchildfunc: callchildfunc, parent: parent} - person Henry; 28.03.2018
comment
Почему бы вам просто не экспортировать модуль, как в коде, который я разместил? - person user2347763; 28.03.2018
comment
Спасибо за ответ. Считайте, что у меня более 30 функций в одном файле. Является ли хорошей практикой перенос всех зависимых функций в экспорт модулей? Допустим, у меня будет 7-8 объектов module.exports, каждый из которых содержит 4-5 зависимых функций. Или другой способ просто обернуть все функции в один module.exports? Каковы будут лучшие практики? - person Henry; 28.03.2018
comment
Это совсем другой вопрос и другой контекст. Если ваш вопрос решен, отметьте это как принятый ответ и задайте его как новый вопрос. - person user2347763; 28.03.2018