2013-06-01 11 views
28

DOMを使用して変更するユニットテスト用のJavaScriptをどうやって調べますか?ユニットテストDOMを含むJavascript

私は簡単な例を挙げます。空白のテキストフィールドをチェックし、javascriptで書かれ、JQueryを使用するフォームバリデーター。

 function Validator() { 

     this.isBlank = function(id) { 
      if ($(id).val() == '') { 
       return true; 
      } else { 
       return false; 
      } 
     }; 

     this.validate = function(inputs) { 

      var errors = false; 

      for (var field in inputs) { 
       if (this.isBlank(inputs[field])) { 
        errors = true; 
        break; 
       } 
      } 

      return errors; 
     }; 
    } 

使用法:

var validator = new Validator(); 
var fields = { field_1 : '#username', field_2 : '#email' }; 

if (!validator.validate(fields)) { 
    console.log('validation failed'); 
} else { 
    console.log('validation passed'); 
} 

ユニットテストにこのような何かをしようとするためのベストプラクティスは何ですか?

+1

PhantomJSをご覧ください。 http://phantomjs.org/ – Brad

+0

参照[JasmineテストでのDOM操作のテスト](0120-339-201) –

+0

.and CasperJs:http ://casperjs.org/ – kaore

答えて

19

理想的には、コードを分割する必要があります。検証ロジックは実際にDOMアクセスを必要としないので、それを独自の関数に置き、IDを処理するロジックを別のものに検証される値に入れます。

このようにすることで、検証ロジックの単体テストをより簡単に行うことができ、必要に応じてJoseph the Dreamerが提案したツールの一部を使用して機能テストを行うことができます。

+1

これは絶対に行く方法です。 DOMとのやりとりは、通常、機能テストや統合テストの多くを実行していることを意味します。独自のユニットテストを使用して、検証コードを別のモジュールに配置します。次に、お気に入りのモジュールローダー(https://github.com/substack/browserifyなど)を使用してモジュールを組み込みます。 – Noah

9

QunitはDOMを含む単体テストに使用できます。自動化したい場合はPhantomJSというヘッドレスWebKitでページを起動するgrunt-contrib-qunitタスクでGruntを使用できます。

+2

そして、これを行う方法の例があります:http://stackoverflow.com/a/4178173/507339 – Nilzor

9

ほとんどのJavaScriptコードにロジックが含まれていて、少量のjQueryコード(またはライブDOM要素)に頼っている場合は、jQueryのDOM /使用へのアクセスを簡単に置き換えて模擬実装:

function Validator(){ 
    this.getElementValue = function(id){return $(id).val();} 

    this.check_blank = function(id){ 
    if(this.getElementValue(id) == '') // replace direct call to jQuery mock-able call 
     return false; 
    else 
     return true; 
    }.... 
} 

とテストでは、モック実装を提供します。

test("Basic valid field", function() { 
    var validation = new Validator(); 

    // replace element accessor with mock implementation: 
    validation.getElementValue = function(id){ 
    equals(id, "#my_field"); // assert that ID is expected one 
    return "7"; 
    } 
    var form_fields = {field_1 : '#my_field'}; 

    ok(validation.validate(form_fields), "non-empty field should be valid"); 
} 
関連する問題