【问题标题】:How to test internal functions, which are needed for internal purposes, using Jasmine如何使用 Jasmine 测试内部用途所需的内部功能
【发布时间】:2013-02-21 07:40:51
【问题描述】:
(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');
});

});

我做得对,在测试中声明函数本身,还是有其他方法? 如果我这样做了功能测试,我认为在源代码中复制实际功能是错误的。也许,有人可以向我展示在模块声明中使用“私有”函数的正确案例

【问题讨论】:

    标签: javascript unit-testing tdd bdd jasmine


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      一般来说,您应该只测试公共接口方法。

      您的初始化程序正在调用_trimString,因此您可以通过它隐式测试它。

      例如:

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

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

      【讨论】:

      • 我添加了一个大纲示例
      猜你喜欢
      • 1970-01-01
      • 2021-04-25
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2021-11-10
      • 2023-01-26
      • 1970-01-01
      相关资源
      最近更新 更多