2015-09-02 5 views
5

Ich muss Tests auf einen bestimmten Controller anwenden.So testen Sie die Funktion außerhalb des Geltungsbereichs und dies in AngularJS Unit Testing

Testen dieser Controller ist ok:

angular.module('app', []).controller('PasswordController', function PasswordController($scope) { 
    $scope.password = ''; 

    $scope.grade = function() { 
     var size = $scope.password.length; 
     if (size > 8) { 
      $scope.strength = 'strong'; 
     } else if (size > 3) { 
      $scope.strength = 'medium'; 
     } else { 
      $scope.strength = 'weak'; 
     } 
    }; 
}); 

Aber ich möchte Test:

angular.module('app', []).controller('PasswordController', function PasswordController($scope) { 


    var vm = this; 
    vm.password = ''; 

    function grade() { 
     var size = vm.password.length; 
     if (size > 8) { 
      vm.strength = 'strong'; 
     } else if (size > 3) { 
      vm.strength = 'medium'; 
     } else { 
      vm.strength = 'weak'; 
     } 
    }; 
}); 

Ich habe versucht, den Controller testen Sie den Code unten verwenden:

describe('Test', function() { 

    beforeEach(module('app')); 

    var MainCtrl, scope; 

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

    it('Should not throw Exception', function() { 
     scope.password = 'abc'; 
     var call = function() { 
      MainCtrl.grade(); 
     } 
     expect(call).not.toThrow(); 
    }); 
}); 

Aber ich bekomme diesen Fehler: Erwartete Funktion nicht zu werfen, aber es warf TypeError: 'undefined' ist n eine Funktion (Bewertung 'MainCtrl.grade()').

Diese stackOverflow Question helfen mir zu testen, um innerhalb 'dieses' zu funktionieren. Aber ich möchte Funktionen außerhalb von $ scope und 'dies' testen ...

Irgendwelche Idee, wie man Komponententests auf diesen Controller anwenden?

Antwort

1

Die Neigungsmethode wird nicht an den Controller angeschlossen;

vm.grade = grade; 

Working Plunkr

+0

Ich denke, die OP absichtlich die Methode "private" gehalten. Es zu veröffentlichen, nur um es zu testen, klingt für mich nicht richtig. – alecxe

+0

Also kann ich keine Methode testen, die nicht an den Controller angeschlossen ist ??? –

+0

Wenn Sie es direkt testen möchten, muss es in irgendeiner Weise ausgesetzt werden. Wenn es von einer anderen Aktion innerhalb des Controllers aufgerufen wird, kann dies verifiziert werden. Wenn Sie zum Beispiel einen Watcher auf vm.password hatten, der die Grad-Methode ausgeführt hat, könnten Sie überprüfen, ob die Stärke-Eigenschaft die nach einem Digest ist. –