如何测试在主函数内部定义的私有函数?

时间:2019-09-11 14:24:24

标签: javascript unit-testing mocha

主要问题是如何测试在主函数内部定义的私有函数?有什么方法可以测试结构中的功能(测试主功能中定义的功能)?

Main.js:

function main (var1) {
  var a;
  //some variables
  configure(getConfig());
  function getConfig() {
    var config = {//some object...
    };
    return config;
  }

  function configure(config) {
     //do somethings;
  }
  function getSyncRates() {
    return syncrates;
  }

  this.getSyncRates = getSyncRates;//public  not waht we want

}

module.exports=(var1)=>{return new main(var1)};

test.js

var main=require("../js/main");
var x=main(var1).getConfig();

describe("main",function(){
  describe("getconfig",function(){
    it("getconfig return config",function(){
      assert.equal(x,config);
    });
  });
});

结果是:

  

结果(...)。getConfig不是函数

1 个答案:

答案 0 :(得分:1)

这是一个模块设计主题。一个模块具有公共和私有功能。现在,按照定义,该模块的使用者将只知道公共模块。 这就是为什么您只想拥有调用公共功能的测试用例。

私有功能通常是对操作的抽象,它有助于增加模块的内聚性。用简单的话来说,它们是实现细节,可能会更改也可能不会更改,并且通常不会更改模块的公共API(即公共功能接口)。

等等?所以我应该让那些线不被发现吗?

不,当然不是。您应该通过公共功能测试私有功能。因此,您将没有直接调用私有函数的测试用例。您将对公共函数进行测试,并传递参数,这些参数将使代码执行通过这些私有函数。

这样,您的测试反映了其他组件将消耗您的模块的方式。它们还将为该模块提供良好的实用文档。

// test.js
var createMain = require("../js/main");

describe('main module', function() {
  describe('getSyncRates()', function() {
    it('returns the sync rates', function() {
      // Arrange
      const myFirstInput = 'foo';

      // Act
      const main = createMain(myFirstInput);
      const rates = main.getSyncRates()

      // Assert
      assert.equals(30, rates);  // assuming we were expecting for the rates to be 30, when we pass 'foo' as the input
    });
  });
});