首页 > 解决方案 > 如何测试主函数内部定义的私有函数?

问题描述

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

主.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)};

测试.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 不是函数

标签: javascriptunit-testingmocha.js

解决方案


这是一个模块设计主题。模块具有公共和私有功能。现在,根据定义,这个模块的消费者只会知道公共的。这就是为什么您只想拥有调用公共函数的测试用例。

私有函数通常是有助于增加模块凝聚力的操作的抽象。简而言之,它们是可能会或可能不会更改的实现细节,并且通常不会更改模块的公共 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
    });
  });
});

推荐阅读