2016-10-05 2 views
0

My Unit-Test hält mit der folgenden Fehlermeldung Fehler:undefiniert ist kein Objekt (Bewertung 'value.phrase.replace')

LOG: 'f40e0e47-6457-463b-a5f9-9dc97bd2d0ce' 
LOG: [Object{phrase_id: 'f40e0e47-6457-463b-a5f9-9dc97bd2d0ce', phrase: 'Training {{group}} to develop their {{attribute}} by ensuring they are comfortable with {{factor}}'}] 
PhantomJS 2.1.1 (Windows 8 0.0.0) PhraseDetailCtrl #initialisation should initialise the controller's scope with details on a single phrase FAILED 
     TypeError: undefined is not an object (evaluating 'value.phrase.replace') in D:/myapp-mobile/www/js/myapp.controllers.js (line 87) 
     D:/myapp-mobile/www/js/myapp.controllers.js:87:34 
     [email protected][native code] 
     D:/myapp-mobile/www/js/myapp.controllers.js:85:35 
     [email protected]/phrase-detail.controller.tests.js:32:26 
     [email protected]:/myapp-mobile/www/js/myapp.controllers.js:78:55 
     [email protected][native code] 
     [email protected]:/myapp-mobile/www/lib/ionic/js/ionic.bundle.js:18010:61 
     [email protected]:/myapp-mobile/www/lib/ionic/js/ionic.bundle.js:23412:39 
     D:/myapp-mobile/www/lib/angular-mocks/angular-mocks.js:2221:21 
     unit-tests/phrase-detail.controller.tests.js:44:31 
     [email protected]://localhost:9876/context.js:151:17 
PhantomJS 2.1.1 (Windows 8 0.0.0): Executed 3 of 3 (1 FAILED) (0.01 secs/0.084 secs) 

Dies ist der Controller ich zu Test versuche:

function PhraseDetailCtrl($scope, $stateParams, PhraseService, CompetencyService, PopupService, ModalService, FilterService, $ionicLoading, $ionicActionSheet, $timeout) { 

    // $ionicLoading.show({ 
    // content: 'Loading', 
    // animation: 'fade-in', 
    // showBackdrop: true, 
    // maxWidth: 200, 
    // showDelay: 0 
    // }); 


    // $timeout(function() { 

     // $ionicLoading.hide(); 
     $scope.dataLoaded = true; 
     $scope.phraseId = $stateParams.phraseId; 

     console.log($scope.phraseId); 

     PhraseService.getPhraseDetail($scope.phraseId).then(function(dataResponse) { 
      $scope.phraseDetail = dataResponse.data; 

      console.log($scope.phraseDetail); 

      var replacers = FilterService.getItemFilter(); 

      Object.keys(replacers).forEach(function(key){ 
       var value = $scope.phraseDetail; 
       value.phrase = value.phrase.replace(new RegExp(key, 'g'), replacers[key]); 
      }) 
     }) 


     PhraseService.getPhraseCompetency($scope.phraseId).then(function(dataResponse) { 
      $scope.phraseCompetencyList = dataResponse.data; 
     }) 


     PhraseService.getPhraseExample($scope.phraseId).then(function(dataResponse) { 

      var data = dataResponse.data; 

     var phrase = data[0].phrase; 
     // console.log("phrase: " + phrase); 

     var tokens = data.map(function(tmp) { 
      return tmp.example; 
     }); 
     // console.log("tokens: " + tokens); 

     var re = /{{[^}]*}}/gi; 
     var placeholders = phrase.match(re); 
     // console.log("placeholders: " + placeholders); 

      if (tokens.length != placeholders.length) { 
       throw new Error("Mismatch number of tokens and placeholders"); 
      } 

      for (var i = 0; i < tokens.length; ++i) { 
       var token = tokens[i]; 
       var placeholder = placeholders[i]; 
       phrase = phrase.replace(placeholder, "<button class=\"button button-small button-outline button-dark button-side-padding\">" + token + "</button>"); 
      } 
     // console.log(phrase); 

     $scope.phraseExample = phrase; 

     }) 


     CompetencyService.getCompetencyList().then(function(dataResponse) { 
      $scope.competencyList = dataResponse.data; 
     }) 


    // }, 1000); 


    // Action sheet 

    $scope.showOptions = function() { 

     $ionicActionSheet.show({ 
      titleText: 'Options', 
      buttons: [ 
       { text: '<i class="icon ion-heart"></i>Add to Favourites' }, 
       { text: '<i class="icon ion-chatbubble"></i> Suggest Improvement' } 
      ], 
      cancelText: 'Cancel', 
      buttonClicked: function(index) { 
       if(index === 0) { 
        $scope.addtoFavouritesPopup(); 
       } else if(index === 1) { 
        $scope.suggestimprovementModal(); 
       } 
       //console.log('BUTTON CLICKED', index); 
       return true; 
      }, 
      cancel: function() { 
       //console.log('CANCELLED'); 
      }, 
     }); 

    }; 


    // Popups 

    $scope.phraseExamplePopup = function() { 
     var myPopup = PopupService.phraseExamplePopup($scope); 
    }; 

    $scope.addtoFavouritesPopup = function() { 
     var myPopup = PopupService.addtoFavouritesPopup($scope); 
    }; 


    // Modals 

    $scope.phraseCompetencyModal = function() { 
     var vm = $scope; 
     ModalService.show('templates/modals/phrase-competency-modal.html', 'PhraseDetailCtrl as vm'); 
    } 

    $scope.suggestimprovementModal = function() { 
     var vm = $scope; 
     ModalService.show('templates/modals/suggest-improvement-modal.html', 'PhraseDetailCtrl as vm'); 
    } 

} 

ich denke, die Fehlermeldung an dieser Stelle geschieht, aber ich bin nicht sicher, wie es an meinem Unit-Test zu verspotten:

Object.keys(replacers).forEach(function(key){ 
       var value = $scope.phraseDetail; 
       value.phrase = value.phrase.replace(new RegExp(key, 'g'), replacers[key]); 
      }) 

Dies ist mein Komponententest:

Antwort

1

Sie sollten auf Null/undefined überprüfen, bevor Sie versuchen, das Objekt z.

if(replacers!=undefined){ 
 
    Object.keys(replacers).forEach(function(key){ 
 
       var value = $scope.phraseDetail; 
 
       if(value !=undefined && value.phrase !=undefined){ 
 
       value.phrase = value.phrase.replace(new RegExp(key, 'g'), replacers[key]); 
 
       } 
 
      }) 
 
}

+0

Danke für Ihre Antwort. Allerdings bekomme ich immer noch die gleiche Fehlermeldung: 'Kann die Eigenschaft 'replace' von 'undefined' nicht lesen und zeigt auf diese Zeile:' value.phrase = value.phrase.replace (new RegExp (key, 'g'), replacers [key]); ' – methuselah

+0

Ich habe die Antwort aktualisiert, um nach // // undefiniert auf den Wert und seine Eigenschaft 'phrase' zu überprüfen. Ich glaube, es sollte jetzt funktionieren. – Owuor

0

Im Test haben Sie eine Antwort Objekt mit data Eigenschaft als array of objects.

Um auf phrase zuzugreifen, haben Sie es so getan response.data[0].phrase. Hier greifen Sie auf die 0thobjectdata Eigenschaft zu.

var response = { 
    status: 200, 
    data: [{ 
     "phrase_id": "f40e0e47-6457-463b-a5f9-9dc97bd2d0ce", 
     "phrase": "Training {{group}} to develop their {{attribute}} by ensuring they are comfortable with {{factor}}" 
    }] 
    }; 

In controller Code haben Sie diese

PhraseService.getPhraseDetail($scope.phraseId).then(function(dataResponse) { 
      // here "dataResponse.data" is returning an array 
      $scope.phraseDetail = dataResponse.data; 

      console.log($scope.phraseDetail); 

      var replacers = FilterService.getItemFilter(); 
      var i = 0; 
      Object.keys(replacers).forEach(function(key){ 
       // Since $scope.phraseDetail is an array of objects, you have to select particular object in the array. 
       var value = $scope.phraseDetail[i]; 
       value.phrase = value.phrase.replace(new RegExp(key, 'g'), replacers[key]); 
       i++; 
      }) 
     }) 

Hoffnung, das hilft.

Verwandte Themen