2013-10-09 17 views
5

Sto provando a testare una direttiva che utilizza un servizio che utilizza alcune risorse. Il problema che ho è quando sto prendendo in giro il metodo get della mia risorsa sarà deriso ma la funzione di callback non verrà chiamata. Pertanto, il risultato non sarà quello che ci si aspetta.AngularJS, Unit test di una direttiva che utilizza un servizio che dipende da alcune risorse

Ho provato a prendere in giro le risorse utilizzando spyOn come suggerito here e anche $httpBackend.when, ma nessuno dei due ha funzionato. Quando eseguo il debug del codice, si otterrà il metodo get ma la funzione get callback non verrà mai chiamata e quindi, la callback interna myCallback che imposta il mio valore non viene mai chiamata. Non sono sicuro che il mio approccio sia corretto, apprezzo i tuoi suggerimenti.

/Resource

.factory ('AirportTimeZone', function($resource){ 
    return $resource('/api/airport/:airportId/timezone',{airportId: '@airportId'}); 
}) 

/servizio che utilizza le mie risorse:

angular.module('localizationService', []) 
.factory('LocalizationService', ['AirportTimeZone','CurrentLocalization', 
    function (AirportTimeZone,CurrentLocalization) { 

    function getAirportTimeZone(airport,myCallback){ 
     var options = {} 
     var localOptions = AirportTimeZone.get({airportId:airport}, function(data){ 
      options.timeZone = data.timeZoneCode 
      myCallback(options) 
     }); 
    } 
}) 

/direttiva

.directive('date',function (LocalizationService) { 
    return function(scope, element, attrs) { 
     var airTimeZone 
     function updateAirportTimeZone(_airportTimeZone){ 
      airTimeZone = _airportTimeZone.timeZone 
      // call other stuff to do here 
     } 
     .... 
     LocalizationService.getAirportTimeZone(airport,updateAirportTimeZone) 
     .... 
     element.text("something"); 
    } 
}); 

/Test

describe('Testing date directive', function() { 
    var $scope, $compile; 
    var $httpBackend,airportTimeZone,currentLocalization 

    beforeEach(function(){ 
     module('directives'); 
     module('localizationService'); 
     module('resourcesService'); 
    }); 

    beforeEach(inject(function (_$rootScope_, _$compile_,AirportTimeZone,CurrentLocalization) { 
     $scope = _$rootScope_; 
     $compile = _$compile_; 
     airportTimeZone=AirportTimeZone; 
     currentLocalization = CurrentLocalization; 

//  spyOn(airportTimeZone, 'get').andCallThrough(); 
//  spyOn(currentLocalization, 'get').andCallThrough(); 

    })); 

    beforeEach(inject(function($injector) { 
     $httpBackend = $injector.get('$httpBackend'); 
//  $httpBackend.when('GET', '/api/timezone').respond({timeZone:'America/New_York',locale:'us-en'}); 
//  $httpBackend.when('GET', '/api/airport/CMH/timezone').respond({timeZone:'America/New_York'}); 
    })) 

    describe('Date directive', function() { 
     var compileButton = function (markup, scope) { 
      var el = $compile(markup)(scope); 
      scope.$digest(); 
      return el; 
     }; 

     it('should',function() { 
      var html = "<span date tz='airport' format='short' airport='CMH' >'2013-09-29T10:40Z'</span>" 
      var element = compileButton(html,$scope) 
      $scope.$digest(); 

      expected = "...." 
      expect(element.html()).toBe(expected); 


     }); 
    }); 
}) 
+1

potrebbe essere solo errori di battitura, ma la vostra LocalizationService non sembra JS validi (non corrispondenti []), e non sono di ritorno dal nulla fabbrica, il che significa che il servizio risulterebbe indefinito. Inoltre ti ricordi di chiamare '$ httpBackend.flush()' dopo la compilazione? – Andyrooger

risposta

4

come commentato in precedenza:

Dopo aver impostato le risposte con $httpBackend.when, sarà comunque necessario chiamare $httpBackend.flush() per scovare la risposta deriso.

Riferimenti:. http://docs.angularjs.org/api/ngMock $ httpBackend - vampate richieste HTTP sezione

Problemi correlati