2016-07-26 7 views
0

Ich bin ein absoluter Noob in Tests und ein paar Dutzend Tutorials haben nicht geholfen. Also bitte nimm mich mit.AngularJS testen mit Karma

Könnte bitte jemand helfen, ein paar Dinge zu verstehen?

Ich habe kein Problem, Tests zu schreiben, um zu prüfen, ob Funktionen definiert sind, aber wie gehe ich tiefer und überprüfe, ob Funktion das Richtige tut und das zurückgibt, was sie erwarten, wenn ziemlich viele von ihnen riesige Daten bekommen Beträge von DB und ich können nicht wirklich das gesamte dataSet verspotten. Prüfe ich es noch irgendwie mit Mockfunktion?

Wie spotze ich ein Argument für eine Funktion, wenn es ein Dataset als Argument akzeptiert? Wie teste ich eine Funktion, die ein paar mehr Funktionen darin verwendet?

Hier ist ein Codebeispiel eines der Funktion nicht herausfinden, ich kann, wie testen:

angular.module('app').controller(controllerId, ['$scope', hourinput]); 

function hourinput($scope) { 

    vm.changeWeek = function (count) { 
        if (count > 0) { 
         vm.selectedDate = moment(vm.selectedDate).add(count, 'weeks'); 
        } else { 
         vm.selectedDate = moment(vm.selectedDate).subtract(-count, 'weeks'); 
        } 
        vm.selectedWeek = moment(vm.selectedDate).isoWeek(); 
        if (vm.selectedWeek != vm.previousSelectedWeek || vm.selectedYear != vm.previousSelectedYear) { 
         vm.previousSelectedWeek = vm.selectedWeek; 
         vm.previousSelectedYear = vm.selectedYear; 
         vm.selectedYear = moment(vm.selectedDate).isoWeekYear(); 
         vm.prevWeek = moment(vm.selectedDate).subtract(1, 'weeks').isoWeek(); 
         vm.nextWeek = moment(vm.selectedDate).add(1, 'weeks').isoWeek(); 
         vm.editingMode = -1; 
         if (count == -1) { 
          getHourInput(moment(vm.selectedDate).startOf('isoWeek').subtract(-count, 'weeks'), moment(vm.selectedDate).startOf('isoWeek').subtract(1, 'days')); 
         } else if (count == 1) { 
          getHourInput(moment(vm.selectedDate).startOf('isoWeek').add(count, 'weeks'), moment(vm.selectedDate).startOf('isoWeek').add(+count + 1, 'weeks').subtract(1, 'days')); 
         } else { 
          getHourInput(); 
         } 
        } 
        applyHourInputFilter() 
       }; 


    function applyHourInputFilter() { 
      vm.filteredHourInputs = vm.hourinputs.filter(hourInputFilter); 
      sortArr(vm.filteredHourInputs); 
      changeItemName() 
     } 
} 

Und hier ist mein Test, der einen Fehler gibt:

describe('app module', function() 
{ 
    beforeEach(module('app')); 
    describe('Testing HI Controller', function(){ 
    var ctrl; 
    var scope; 

    beforeEach(inject(function ($rootScope, $controller) { 
      scope = $rootScope.$new(); 
      ctrl = $controller('hourinput', { $scope: scope }); 
     })); 


     it('should spyOn changeWeek call through', function() 
     { 
      spyOn(scope, 'applyHourInputFilter').and.callThrough(); 
      ctrl.changeWeek(1); 
      expect(scope.applyHourInputFilter).toHaveBeenCalled(); 
     }); 

     }); 
}); 

Ausgang ich habe ist :

Test Outcome: Failed 
Result Message: Error: applyHourInputFilter() method does not exist 
Result StandardError: Error: applyHourInputFilter() method does not exist 
    at Object.<anonymous> 

Jeder Rat ist sehr geschätzt.

Antwort

1

Es ist eine private Funktion nicht

Änderung des Umfangs angebracht ist, die

funktionieren
$scope.applyHourInputFilter=function() { 
vm.filteredHourInputs = vm.hourinputs.filter(hourInputFilter); 
     sortArr(vm.filteredHourInputs); 
     changeItemName() 
    } 
+0

noch genau die gleichen Fehler. Ich habe auch versucht, es als 'vm.applyHourInputFilter = function() { \t \t vm.filteredHourInputs = vm.hourinputs.filter (hourInputFilter); \t \t \t sortArr (vm.filteredHourInputs); \t \t \t changeItemName() \t \t} ' Hat nicht geholfen. –