如何使用Jasmine测试内部功能,这些功能用于内部目的

How to test internal functions, which are needed for internal purposes, using Jasmine

本文关键字:内部 功能 用于 测试 何使用 Jasmine      更新时间:2023-09-26
(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');
});

});

我做得对,在测试中声明函数本身,或者有其他方法吗?如果我这样做的功能测试,我认为,错误的复制实际功能的源代码。也许,有人可以告诉我在模块声明中使用"私有"函数的正确情况

我同意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(){ ... }); 
});

一般情况下,您应该只测试公共接口方法。

你的初始化器正在调用_trimString,所以你可以通过它隐式地测试它。

例如:

it("trims whitespace"), function(){
  var circular = Circular.new(' foo ')
  expect(circular.text).toBe('foo')
}

您可能需要重构一些现有的代码以使其更易于测试。displayCorrectText目前有两个不同的职责——操作某个字符串和打印结果,这违反了单一职责原则。