[英]Mocha / Sinon - Unit testing / stubbing function with child_process.exec inside ES6 Promise
我有一個函數返回ES6承諾,用於另一個外部promise鏈。 該功能使用child_process.exec掃描wifi網絡。 exec的輸出通過回調發送到同步解析函數,該函數將返回格式化對象中的輸出,然后解析外部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方法,所以我應該完全拋棄測試'scan'函數並且只關注解析函數(這將很容易測試),或者是否有另一個我應該看看這個嗎?
我相信我只是在做一些明顯錯誤的事情,而且已經在這里打了幾個小時。 我希望有人之前遇到過這種情況,可以建議一種替代/更好的方法。
你可以使用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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.