2014-06-19 22 views
8

L'unità sta testando un controller e voglio testare un gestore di eventi. Dire il mio controller appare come:

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

dovrei aver trasmesso che nella mia prova di Jasmine? Lo avrei emesso? C'è uno standard accettato?

+0

Hai provato la mia soluzione? – glepretre

+0

Come sei finito a testare questo, @MailmanOdd? – chepukha

+0

Ho appena aggiunto/accettato la mia soluzione, spero che sia d'aiuto. –

risposta

13

La soluzione mi è venuta è la seguente:

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

Sono confuso ma, non è quello che ho risposto? – glepretre

+1

È simile ma chiama $ scope. $ Digest non era necessario. Infatti nella mia domanda (diversa da questa domanda semplificata) stava effettivamente causando problemi. Inoltre, credo di aver risolto il problema prima di vedere il tuo post e di non aver mai più controllato la domanda: scusa! –

4

Io non credo che ci sia "uno standard accettato", ma secondo $location source code l'evento viene trasmesso, quindi vorrei prendere in giro questo comportamento e testare in questo modo:

'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

Grazie. Ho salvato la mia giornata. –

Problemi correlati