2014-06-19 4 views
8

Ich bin Einheit testen einen Controller und ich möchte einen Event-Handler testen. Angenommen, mein Controller sieht so aus:

myModule.controller('MasterController', ['$scope', function($scope){ 
    $scope.$on('$locationChangeSuccess', function() { 
     $scope.success = true; 
    }); 
}]); 

Würde ich das in meinem Jasmine-Test übertragen? Würde ich es ausstrahlen? Gibt es einen akzeptierten Standard?

+0

Haben Sie meine Lösung versucht? – glepretre

+0

Wie hast du das getestet, @MailmanOdd? – chepukha

+0

Ich habe gerade meine Lösung hinzugefügt/akzeptiert, hoffe, dass es hilft. –

Antwort

13

Die Lösung kam ich mit ist wie folgt:

describe('MasterController', function() { 
    var $scope, $rootScope, controller, CreateTarget; 

    beforeEach(function() { 
     inject(function($injector) { 
      $rootScope = $injector.get('$rootScope'); 
      $scope = $rootScope.$new(); 

      var $controller = $injector.get('$controller'); 

      CreateTarget = function() { 
       $controller('MasterController', {$scope: $scope}); 
      } 
     }); 
    }); 

    describe('$locationChangeSuccess', function() { 
     it('should set $scope.success to true', function() { 
      controller = CreateTarget(); 
      $rootScope.$broadcast('$locationChangeSuccess'); 
      expect($scope.success).toBe(true); 
     }); 
    }); 
}); 
+0

Ich bin verwirrt, aber antwortete ich nicht? – glepretre

+1

Es ist ähnlich, aber Aufruf von $ scope. $ Digest war unnötig. Tatsächlich hat es in meiner Bewerbung (anders als diese vereinfachte Frage) tatsächlich Probleme verursacht. Außerdem glaube ich, dass ich das Problem gelöst habe, bevor ich deinen Beitrag gesehen habe und die Frage nie wieder überprüft habe - sorry! –

4

Ich glaube nicht, dass es „ein akzeptierter Standard“, aber nach $location source code das Ereignis gesendet wird, so würde ich dieses Verhalten verspotten und es auf diese Weise testen:

'use strict'; 

describe('MasterController', function() { 
    var MasterController, 
     $rootScope, 
     $scope; 

    beforeEach(module('myModule')); 

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

    describe('$locationChangeSuccess event listener', function() { 
    it('should set $scope.success to true', function() { 
     var newUrl = 'http://foourl.com'; 
     var oldUrl = 'http://barurl.com' 

     $scope.$apply(function() { 
     $rootScope.$broadcast('$locationChangeSuccess', newUrl, oldUrl); 
     }); 

     expect($scope.success).toBe(true); 
    }); 
    }); 
}); 
+0

Danke. Habe meinen Tag gerettet. –

Verwandte Themen