2013-06-25 48 views
2

我有一個angularjs應用程序,它驗證某些輸入字段。我正在通過Jasmine編寫單元測試來測試和維護這些字段的有效性。使用茉莉花與角JS輸入驗證

注:驗證正常工作正常,只是與茉莉花,它似乎並沒有更新。 單元測試有沒有語法錯誤,而僅僅導致:

Error: Expected false to equal true. 
    at new jasmine.ExpectationResult 
    at null.toEqual 
    at null.<anonymous> 
    at jasmine.Block.execute 
    at jasmine.Queue.next_ 
    at chrome-extension 

舉例來說,我有,在指令:

}).directive('billingNumberPopup', function() { 
return { 
    require: 'ngModel', 
    link: function(scope, elm, attrs, ctrl) { 

     scope.$watch(
       function() { 
        return ctrl.$viewValue; 
       }, 
       function(value){ 
        numValidation(value); 
       } 
      ); 
     function numValidation(viewValue){ 
      if (!viewValue || viewValue == "" || (!viewValue.toString().match(/[a-z]/gi) && viewValue.toString().match(/[0-9]/g).length == 6)){ 
       ctrl.$setValidity('billingNumber',true); 
      } 
      else 
      { 
       ctrl.$setValidity('billingNumber',false);     
      } 

,然後從我的單元測試...

it('Check if validation works', function(){ 
    var len = $scope.dataToPost.length; 
    $scope.addRow(); 
    console.log("Hi"); 
    $scope.$apply(function(){ 
     $scope.dataToPost[len].billingNumber = "HELLO";}); 
    $scope.$apply(); 
    console.log($scope.dataToPost[len].billingNumber); 
    console.log($("input[ng-model='d.billingNumber']"));  
    expect($("input[ng-model='d.billingNumber']")[len].classList.contains("ng-invalid")).toEqual(true); 

}); 

其中「HELLO」不是有效的帳單號碼,而scope.dataToPost是綁定到輸入字段的數據。我會假設,改變價值,並呼籲$scope.$apply會觸發驗證,有什麼建議嗎?

+0

我的理解是,指令是屁股單元測試有點痛。也許將驗證測試移到e2e測試中會更容易? –

+0

是的,非常感謝您在正確的方向上引導我。儘管Jasmine能夠測試指令本來不錯,但我想我會用e2e來測試指令。再次感謝! –

回答

2

茉莉花錯誤表明您正試圖訪問空對象。

當您訪問len而不是數組的len - 1索引時,會出現這種情況。嘗試改變期望:

expect($("input[ng-model='d.billingNumber']")[len - 1].classList.contains("ng-invalid")).toEqual(true);