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