测试嵌套AngularJS与Jasmine的承诺

Testing nested AngularJS promises with Jasmine

本文关键字:承诺 Jasmine 嵌套 AngularJS 测试      更新时间:2024-06-24

我想测试嵌套的promise,但我不知道如何进行。

我该如何测试这样的场景?

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

我想在哪里测试

    expect(serviceB, 'create').toHaveBeenCalled();
    expect($state, 'go').toHaveBeenCalledWith("app.list", { id: newId });
    expect(serviceB, 'doSomething').toHaveBeenCalled();
    expect(serviceB, 'doSomethingElse').toHaveBeenCalled();

这是我的尝试:

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

任何建议都将不胜感激

在每次承诺之后,您必须调用$rootScope.$apply(),这样承诺就被填满了。