2017-01-20 95 views
1

我有一個函數返回一個ES6承諾在另一個外部承諾鏈中使用。該功能使用child_process.exec掃描wifi網絡。從高管的輸出通過回調發送到同步解析函數會返回一個格式化的對象輸出,然後解析外承諾:摩卡/ Sinon - 單元測試/ stubbing功能與ES6裏面的child_process.exec承諾

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); 
     }); 
    }); 
} 

的問題是,我似乎無法得到興農存根正常工作以獲取被調用的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確實會被調用,但是「真正的」函數無論如何都會被調用。所有我真正「測試」的是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]); 

終於,你可以得到versionList[1,2,3]