(function(window,document){
var _trimString = function( string ){
var trimString;
trimString = string.replace(/^\s+|\s+$/g,'');
return trimString
};
var displayCorrectText = function( incorrecttext ){
correctText = "."+incorrecttext;
document.write( correctText );
}
var Circular = function(){};
Circular.prototype.init = function( string ){
displayCorrectText( _trimString( string ) );
};
var circular = new Circular();
window.circular = circular;
})(window,document);
circular.init('asd.asd');
我有这个模块声明,我想使用Jasmine测试 _trimString 函数。
我写了类似这段代码的东西describe("Form Creator private function ", function(){
it("_trimString should trim string", function(){
var _trimString = function( string ){
var trimString;
trimString = string.replace(/^\s+|\s+$/g,'');
return trimString
};
expect(_trimString(' test text ') ).toBe('test text');
});
});
我做得对,在测试中声明函数本身,还是有另一种方式? 如果我这样做了功能测试,我认为,在源代码中复制实际功能是错误的。也许,有人可以告诉我在模块声明中使用“私有”功能的正确理由
答案 0 :(得分:2)
我同意Andy Waite:一般来说,你应该只测试公共接口方法。
但是,如果您认为此私有方法确实需要直接测试,则可能是问题的症状。它闻起来像这种方法做了太多的工作(或至少你认为重要的工作)。如果是这种情况,请考虑将其逻辑提取到服务对象中并委托给它。这样便于单独测试服务对象。
修改强>
在代码中:
var Circular = function(){
this.trimmer = new Trimmer();
};
Circular.prototype.init = function( string ){
this.displayText = this.trimmer.trim( string );
};
var circular = new Circular();
circular.init(" test ").displayText // should be trimmed
...
// test trimmer separately
describe("Trimmer", function(){
it("trims string", function(){ ... });
});
答案 1 :(得分:1)
通常,您应该只测试公共接口方法。
您的初始化程序正在调用_trimString
,因此您可以通过它隐式测试它。
例如:
it("trims whitespace"), function(){
var circular = Circular.new(' foo ')
expect(circular.text).toBe('foo')
}
您可能需要重新构建一些现有代码,以使其更易于测试。 displayCorrectText
目前有两个不同的职责 - 操纵一些字符串并打印结果,这违反了单一责任原则。