我有一个返回ES6承诺的函数,可以在另一个外部promise链中使用。该功能使用child_process.exec扫描wifi网络。 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);
});
});
}
问题是,我似乎无法使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 :(得分: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]