主要问题是如何测试在主函数内部定义的私有函数?有什么方法可以测试结构中的功能(测试主功能中定义的功能)?
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不是函数
答案 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
});
});
});