簡體   English   中英

Mocha / Sinon - 在ES6 Promise中使用child_process.exec進行單元測試/存根功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM