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