2015-09-02 13 views
5

Ho bisogno di applicare il test a un controller particolare.Come testare la funzione al di fuori dell'ambito e questo in AngularJS Unit Test

Testing questo controller è 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'; 
     } 
    }; 
}); 

Ma vorrei prova:

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'; 
     } 
    }; 
}); 

ho cercato di verificare il controller usando il codice seguente:

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(); 
    }); 
}); 

Ma ottengo questo errore: Funzione prevista per non lanciare, ma ha lanciato TypeError: 'undefined' è n di una funzione (valutando 'MainCtrl.grade()').

Questo stackOverflow Question mi aiuta ad applicare il test per funzionare all'interno di "questo". Ma voglio testare funzioni su $ scope e 'this' ...

Qualche idea su come applicare il test dell'unità a questo controller?

risposta

1

Il metodo di valutazione non viene collegato al controller;

vm.grade = grade; 

Working Plunkr

+0

credo che il PO volutamente tenuto il metodo del "privato". Rendendolo pubblico solo per il gusto di testarlo non mi sembra giusto. – alecxe

+0

Quindi, non posso testare un metodo che non viene collegato al controller ??? –

+0

Se si desidera testarlo direttamente, deve essere in qualche modo esposto. Se è chiamato da un'altra azione all'interno del controller, è possibile verificarlo. Ad esempio, se si avesse un watcher su vm.password che eseguiva il metodo di valutazione, si sarebbe in grado di verificare che la proprietà di forza sia quella che dovrebbe essere dopo un digest. –

Problemi correlati