2016-04-13 15 views
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

Antwort

0

Nach jedem versprechen würde geschätzt Sie $rootScope.$apply() verlangen so werden Versprechungen erfüllt.

Verwandte Themen