2016-08-31 4 views
5

Funktion in der Steuerung:, wie Sie testen Funktion im Steuerungsbereich ausgeführt durch Ereignis

angular.module('myApp').controller('MyController', function(){ 

    $scope.f = function($event){ 
     $event.preventDefault(); 
     //logic 
     return data; 
    } 
}) 

describe('MyController', function(){ 
    'use strict'; 
    var MyController, 
     $scope; 

    beforeEach(module('myApp')); 

    beforeEach($inject(function($rootScope, $controller){ 
     $scope = $rootScope.$new(); 
     MyController = $controller('MyController', { 
      $scope: $scope 
     }) 
    })); 
}) 
it('should...', function(){ 
    //fire event and expect data 
}) 

$scope.f Funktion in der Richtlinie verwendet wird, kann es durch ng-click="f($event)"

ausgeführt werden, was für Brandereignis in Einheit richtig ist Prüfung?

+1

Könnten Sie etwas mehr Kontextinformationen zur Verfügung stellen? –

+0

@EvanBechtol sorry, ich hoffe jetzt ist es klarer – rossoneri

Antwort

4

Kurzantwort

Sie müssen nicht um das Ereignis zu feuern. Sie haben Zugriff auf den Bereich, der über die Funktion verfügt, die Sie testen möchten. Dies bedeutet, dass Sie nur die Funktion ausführen und dann bestätigen. Es wird wie folgt aussehen:

it('should call preventDefault on the given event', function(){ 
    var testEvent = $.Event('someEvent'); 
    $scope.f(testEvent); 
    expect(testEvent.isDefaultPrevented()).toBe(true); 
}); 

Siehe folgende:

Voll Spec

auch - Ihr it Block sollte b e in Ihrem describe Block, so dass es Zugriff auf das Feld $scope hat. Es sollte mehr wie folgt aussehen:

describe('MyController', function(){ 
    'use strict'; 
    var MyController, 
     $scope; 

    beforeEach(module('myApp')); 

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

    it('should call preventDefault on the given event', function(){ 
    var testEvent = $.Event('someEvent'); 
    $scope.f(testEvent); 
    expect(testEvent.isDefaultPrevented()).toBe(true); 
    }); 
}) 

Hinweis zum Aufbau

Sie Ihre Tests keine Angst, die describe Blöcke zu verwenden, zu strukturieren. Stellen Sie sich auf die $scope genannt f2 eine andere Funktion hatte, dann würden Sie wahrscheinlich Spec-Datei auf mehr so ​​partitionieren möchten:

describe('MyController', function(){ 
    'use strict'; 
    var MyController, 
     $scope; 

    beforeEach(module('myApp')); 

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

    describe('$scope', function() { 
    describe('.f()', function() { 
     // tests related to only the .f() function 
    }); 

    describe('.f2()', function() { 
     // tests related to only the .f2() function 
    }); 
    }); 
}) 

Dies den Vorteil hat, dass, wenn ein Test fehlschlägt, können Sie die Fehlermeldung konstruiert basierend auf der Hierarchie von describe Blöcke. So wäre es so etwas wie:

MyController $ Rahmen .f() prevent auf dem gegebenen Ereignis nennen sollte

Verwandte Themen