0
Ich möchte verschachtelte Versprechen testen und bin mir nicht sicher, wie ich das anstellen soll.Testen von verschachtelten AngularJS-Versprechungen mit Jasmine
Wie würde ich ein Szenario wie dieses testen?
angular.module('moduleA')
.factory('serviceA', function(serviceB){
return {
create: create
}
function create(){
return serviceB.create().then(function(d){
serviceB.doSomething();
return $state.go("app.list", { id: d.id }).then(function(){
serviceB.doSomethingElse();
});
})
};
});
Wo ich meinen Versuch testen möchte, ist
expect(serviceB, 'create').toHaveBeenCalled();
expect($state, 'go').toHaveBeenCalledWith("app.list", { id: newId });
expect(serviceB, 'doSomething').toHaveBeenCalled();
expect(serviceB, 'doSomethingElse').toHaveBeenCalled();
hier:
describe('serviceA spec', function() {
var $rootScope, $state, serviceA, serviceB;
beforeEach(function() {
$state = {
go: function(){}
}
serviceB = {
create: {},
doSomething: {},
doSomethingElse: {}
}
module('app', function($provide){
$provide.value('serviceB', serviceB);
$provide.value('$state', $state);
});
inject(function (_$rootScope_, _serviceA_) {
serviceA =_serviceA_;
$rootScope = _$rootScope_;
});
});
it('should create', function(){
var newId = "555";
spyOn($state, 'go').and.callFake(function() {
var deferred = $q.defer();
deferred.resolve({});
return deferred.promise;
});
spyOn(serviceB, 'create').and.callFake(function() {
var deferred = $q.defer();
deferred.resolve({ id: newId });
return deferred.promise;
});
spyOn(serviceB, 'doSomething');
spyOn(serviceB, 'doSomethingElse');
serviceA.create();
expect(serviceB, 'create').toHaveBeenCalled();
expect($state, 'go').toHaveBeenCalledWith("app.list", { id: newId });
expect(serviceB, 'doSomething').toHaveBeenCalled();
expect(serviceB, 'doSomethingElse').toHaveBeenCalled();
$rootScope.$digest();
});
});
Irgendwelche Vorschläge viel