使用 ForEach 与磁带和 Sinon 对 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();
});

我已经查看了文档,但作为一个菜鸟,我不确定如何获得覆盖率并测试突出显示的代码。

如果有人能帮助我或指出我正确的方向,我将不胜感激。

谢谢

你不需要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 = 'cert1n-END CERTIFICATE-ncert2n-END CERTIFICATE-';
const fsStub = sinon.stub(fs, 'readFileSync').returns(fileContents);
const result = certUtils.getAuthCert(caFilePath);
fsStub.restore();
t.deepEquals(result, ['cert1n-END CERTIFICATE-', 'cert2n-END CERTIFICATE-']);
t.end();
});

我在let/const和构建文件方面采取了一些自由,您需要的关键更改是使存根返回我称之为fileContents的字符串。

最新更新