【问题标题】:Testing nested AngularJS promises with Jasmine使用 Jasmine 测试嵌套的 AngularJS 承诺
【发布时间】:2017-03-01 18:21:06
【问题描述】:

我正在测试嵌套的 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();

});

});

任何建议将不胜感激

【问题讨论】:

    标签: javascript angularjs unit-testing jasmine angular-mock


    【解决方案1】:

    在每个承诺之后,您必须致电 $rootScope.$apply(),这样承诺就会得到履行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2020-07-30
      • 1970-01-01
      相关资源
      最近更新 更多