2013-10-09 4 views
5

Ich versuche Unit-Test eine Direktive zu testen, die einen Dienst verwendet, der einige Ressourcen verwendet. Das Problem, das ich habe, wenn ich die Methode get meiner Ressource verspotze, wird es verspottet, aber die Rückruffunktion wird nicht aufgerufen. Daher wird das Ergebnis nicht erwartet.AngularJS, Einheit, die eine Direktive testet, die einen Dienst verwendet, der von einigen Ressourcen abhängt

Ich habe versucht, die Ressourcen mit spyOn wie vorgeschlagen here und $httpBackend.when zu verhöhnen, aber keiner der beiden funktionierte. Wenn ich den Code debugge, wird es zur Methode get kommen, aber die Callback-Funktion wird nie aufgerufen und daher wird der innere Callback myCallback, der meinen Wert setzt, nie aufgerufen. Ich bin mir nicht sicher, ob meine Vorgehensweise überhaupt richtig ist, ich weiß Ihre Vorschläge zu schätzen.

/Ressourcen

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

/Service, der meine Ressourcen verwendet:

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

/Richtlinie

.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

könnte nur Tippfehler sein, aber Ihr LocalizationService sieht nicht aus wie gültig JS (nicht übereinstimmen []), und Sie werden nichts von der Rückkehr Fabrik, was bedeutet, dass der Service als undefiniert erscheinen würde. Erinnern Sie sich auch, '$ httpBackend.flush()' nach dem Kompilieren aufzurufen? – Andyrooger

Antwort

4

Wie kommentiert oben:

Nach Antworten mit $httpBackend.when einrichten, müssen Sie noch $httpBackend.flush() rufen die verspottete Antwort auszuspülen.

. Bezug: http://docs.angularjs.org/api/ngMock $ httpBackend - Spülung HTTP-Anfragen Abschnitt

Verwandte Themen