2017-01-20 14 views
1

У меня есть функция, которая возвращает обещание ES6 для использования в другой внешней цепочке обещаний. Функция сканирует сети Wi-Fi, используя child_process.exec. Выход из Exec отправляется через обратный вызов к синхронной функции синтаксического анализа, которая будет возвращать выход в виде форматированного объекта, а затем разрешить внешний посыл:Mocha/Sinon - Модульная проверка/функция stubbing с child_process.exec внутри ES6 Promise

var exec = require('child_process').exec; 

function scan() { 
    return new Promise((resolve, reject) => { 

     // getCurrent returns a promise 
     getCurrent().then(network => { 
      exec('iwlist wlan0 scan', function(err, stdout, stderr) { 
       (err) ? reject(stderr) : resolve(parseOutput(stdout, network));     
      }); 
     }) 
     .catch(err => { 
      reject(err); 
     }); 
    }); 
} 

проблема, я не могу показаться, чтобы получить Sinon которые работают правильно, чтобы получить названную версию exec. В настоящее время у меня есть что-то вдоль линий:

var wifi = require('./wifi'); 

describe('#scan', function() { 

    it('Should scan and return networks object', function() { 

     var fakeNetwork = '(fake iwlist output goes here)'; 
     var exec = sinon.stub(child_process, 'exec').yields(false, fakeNetwork); 
     var getCurrent = sinon.stub(wifi, 'getCurrent').returns(Promise.resolve('current-ssid')); 

     wifi.scan().then(function(networks) { 
      console.log(networks); 
      sinon.assert.calledOnce(getCurrent); 
      sinon.assert.calledOnce(exec); 
     }); 

     getCurrent.restore(); 
     exec.restore(); 

    }); 
}); 

Я также попытался гася как:

var getCurrent = sinon.stub(wifi, 'getCurrent', function() { 
    return Promise.resolve('current-ssid').then(network => { 
     exec('iwlist wlan0 scan', function(err, data) { 
      return(wifi.parseOutput(data, network));     
     }); 
    }); 
}); 

поведение, кажется, что либо Exec никогда не вызывается, или более странно, что погасил Exec вызывается, но «реальные» функции вызываются в любом случае.

Со всеми заглушками, все, что я действительно «тестирую», является методом parseOutput, поэтому я должен полностью отключить тестирование функции «сканирования» и сосредоточиться только на функции синтаксического анализа (которая будет проста в тестировании) или есть другой способ, которым я должен смотреть на это?

Я считаю, что я просто делаю что-то явно не так, и вот уже несколько часов стучаю по стене. Я надеюсь, что кто-то столкнется с этим раньше и может предложить альтернативный/лучший подход.

ответ

0

вы можете использовать stub.yields ([arg1, arg2, ...])sinon stubs guide

вот мой код

function getVersioniList() { 
    let versionList = new Promise((resolve, reject) => { 
     child_process.exec(cmd, function(error, stdout, stderr) { 
      if (error) { 
       reject(error); 
      } 
      resolve(stdout); 
     }); 
    }); 

    return versionList; 
} 

и модульного тестирования кода, как показано ниже

// i like the sandbox, or you can use sinon itself 
sandbox = sinon.sandbox.create(); 
sandbox.stub(child_process, 'exec').yields(undefined, [1, 2, 3]); 

assert.equal(await getVersioniList(), [1, 2, 3]); 

, наконец, вы можете получить версияList[1, 2, 3]