2
(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');
});

});

テストで関数自体を宣言していますか、それとも別の方法がありますか? 機能テストを行った場合、実際の機能をソースコードにコピーするのは間違っていると思います。たぶん、誰かがモジュール宣言で「プライベート」関数を使用する正しいケースを教えてくれるかもしれません

4

2 に答える 2

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(){ ... }); 
});
于 2013-03-06T14:55:23.240 に答える
1

一般に、パブリック インターフェイス メソッドのみをテストする必要があります。

イニシャライザが呼び出さ_trimStringれているため、それを介して暗黙的にテストできます。

例えば:

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

これをよりテストしやすくするために、既存のコードの一部を再構築する必要がある場合があります。displayCorrectText現在、いくつかの文字列を操作し、結果を出力するという 2 つの異なる責任があります。これは、単一責任の原則に違反しています。

于 2013-03-06T14:46:25.583 に答える