2017-03-04 117 views
1

我是JavaScript的新手。我正在嘗試使用proxyquire編寫基本的單元測試。下面的代碼。爲async.parallel編寫測試。

文件答:

const modA=require('./modA'); 
const modB=require('./modB'); 
const async=require('async'); 
module.exports=function(a,b,callback){ 

async.parallel([ 
    function(callback){ 
     // db call 
     modA(a,b,callback); 
    }, 
    function(callback){ 
     // db call 
     mobB(a,b,callback); 
    } 
], 
//not able to test code 
(err,res){ 
    //do something  
}); 

};

文件單元測試看起來如下:

const proxyquire=require('proxyquire'); 


function modaAStub(a, b, callback) { 
    return (null, modAresponse); 
} 

function modaBStub(a, b, callback) { 
    return (null, modaBresponse); 
} 

describe('test suite',() => { 
    it('test: should return results', (done) => { 
    const fileA = proxyquire('../../fileA', { 
     './modA': modaAStub, 
     './modB': modaBStub 
    }); 

    fileA(someinput1,someinput2); 
    done(); 
    }); 
}); 

的問題是,我無法弄清楚如何測試中的fileA的碼具有「//做一些事情」。

欣賞任何指針/代碼。

感謝。

回答

0

您可以傳入另一個函數,並將其用作回調函數。

function callbackStub(err, result) { 
    return (null, modAresponse); 
} 

然後在文件中:

// import the callback stub above 
async.parallel([ 
function(callback){ 
    // db call 
     modA(a,b,callback); 
    }, 
    function(callback){ 
     // db call 
     mobB(a,b,callback); 
    } 
],callbackStub); 
+0

我很困惑。我正在爲fileA編寫測試。如果我更改我的文件我正在更改我的實際代碼。我可能會丟失一些東西。 – user1948304

+0

我真的不明白你想要測試什麼 - 理論上,測試應該驗證.parallel函數將正確的輸出返回給回調函數。如果您想要單獨測試回調,則無需將其作爲並行邏輯的一部分,只需將輸入嘲笑爲輸入即可。 – Josh

+0

你可以嘲笑輸入作爲它的輸入 - 你可以詳細說明這個問題。我有的問題是modA,modB是數據庫調用。所以我只是希望他們被剔除,輸出是什麼並驗證模擬結果。這只是爲了測試邏輯/ /做一些事情。我不希望異步本身的實際運行。 – user1948304

1

好吧,我已經過了的fileA stupid.The單元測試看起來像下面。

const proxyquire=require('proxyquire'); 
    const async=require('async'); 
    const expect=require('chai').expect; 

    const modAresponse={ 
     a:'1' 
    }; 
    const modBresponse={ 
     b:'1' 
    }; 
    const a={ 
     a:'1' 
    }; 
    const b={ 
     b:'1' 
    }; 
    const someresponse={ 
     a:'1', 
     b:'1' 
    }; 
    function modaAStub(a, b, callback) { 
     return callback(null, modAresponse); 
    } 

    function modaBStub(a, b, callback) { 
     return callback(null, modaBresponse); 
    } 

    describe('test suite',() => { 
     it('test: should return results', (done) => { 
     const fileA = proxyquire('../../fileA', { 
      './modA': modaAStub, 
      './modB': modaBStub, 
      async 
     }); 

     fileA(a,b,(err,response)=>{ 
        expect(JSON.stringify(response)).to.equal(JSON.stringify(someresponse)); 
     }); 
     done(); 
     }); 
    }); 
+0

看起來不錯!很高興你明白了 – Josh