2017-07-10 48 views
0

我正在努力單元測試以下函數。特別是我不能讓它覆蓋突出顯示的代碼:使用帶有磁帶和Sinon的ForEach的單元測試JavaScript函數

function authCert(trustedCAFile){ 
    let ca = []; 
    let cert = []; 
    let trustedCA = String(fs.readFileSync(trustedCAFile)); 
    let trustedCALines = trustedCA.split("\n"); 

    trustedCALines.forEach(function(entry){ 

    cert.push(entry); 
    if(entry.match(/-END CERTIFICATE-/)){ 
     **ca.push(cert.join("\n")); 
     cert = [];** 
    } 
}); 

return ca; 
} 

這是我目前的測試:

let test = require('tape'); 
let rewire = require('rewire'); 
let sinon = require('sinon'); 
let fs = require('fs'); 
let proxyquire = require('proxyquire'); 

test('should cycle through trusted ', function(t) { 
    let authCert = rewire('../authCert'); 
    let getAuthCerts = certUtils.getAuthCert; 

    let certStub = 'test'; 

    let fsStub = { 
     readFileSync:() => {} 
    }; 

    let ca = []; 
    ca.push('1'); 

    certUtils.__set__('fs', fsStub); 

    let result = getAuthorisedCerts(certStub); 

    t.deepEquals(result, []); 
    t.end(); 

}); 

我已經看過的文件,但作爲一個小白,我不知道該如何去獲得覆蓋並測試突出顯示的代碼。

如果任何人都可以幫助我或指出我朝着正確的方向,我會非常感激。

感謝

回答

0

你不需要proxyquire(未實際使用)或rewire做你想要做的測試。

我們可以使用sinon來爲測試存根fs對象。

就獲得您想要的覆蓋範圍而言,您所需要做的就是使readFileSync存根實際上返回至少包含一個'-END CERTIFICATE-'的東西。

const test = require('tape'); 
const sinon = require('sinon'); 
const fs = require('fs'); 

const certUtils = require('../authCert'); 
const caFilePath = 'test'; 

test('should return each certificate', function(t) { 
    const fileContents = 'cert1\n-END CERTIFICATE-\ncert2\n-END CERTIFICATE-'; 
    const fsStub = sinon.stub(fs, 'readFileSync').returns(fileContents); 
    const result = certUtils.getAuthCert(caFilePath); 

    fsStub.restore(); 

    t.deepEquals(result, ['cert1\n-END CERTIFICATE-', 'cert2\n-END CERTIFICATE-']); 
    t.end(); 
}); 

我已經採取了一些自由在let/const方面和構建文件,你需要的關鍵變化正在存根返回我叫fileContents的字符串。