使用Tape和Sinon的ForEach对JavaScript函数进行单元测试

时间:2017-07-10 08:22:05

标签: javascript node.js unit-testing sinon

我正在努力对以下功能进行单元测试。特别是我无法覆盖突出显示的代码:

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();

});

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

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

由于

1 个答案:

答案 0 :(得分: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的字符串。