0

在尝试测试返回普通 $q 承诺的服务时,我遇到了一件奇怪的事情。我在任何测试中尝试的任何承诺实际上都不会被解决/拒绝(更具体地说,then不会调用来自的处理程序,承诺中的代码运行得很好)。我什至尝试在根范围内强制进行摘要,正如 SO 上的其他一些答案所建议的那样,没有任何运气。

这是一个独立的小例子:

describe('promise', function(){
  jasmine.DEFAULT_TIMEOUT_INTERVAL = 500;
  let q;

  beforeEach(inject(function($q){
    q = $q;
  }));

  it('finishes', function(done){
    expect(q).toBeDefined();
    const promise = q.resolve();
    console.log(promise);
    promise.then(
      () => done(),
      () => done.fail()
    );
  });
});

我必须做什么才能使承诺按预期工作?

4

2 回答 2

2

我希望这个例子可以帮助你使用 $rootScope.$digest() (我知道你已经尝试过强制摘要)。只需忽略类型声明(使用打字稿编写)

    var service: IService;
    var $rootScope: ng.IRootScopeService;
    var $q: ng.IQService;

    beforeEach(() => {
        angular.mock.module("app");
        angular.mock.inject((
            _$rootScope_: ng.IRootScopeService,
            _$q_: ng.IQService
        ) => {
            // Assign dependecies
            $q = _$q_;
            $rootScope = _$rootScope_;
        });

        // Initialize service
        service = new Service($q);
    });


    it("should call errorCallback", () => {
        let callback = {
            errorCallback: function (response: any) { /*empty function */ }
        };

        spyOn(callback, "errorCallback");

        service.connect(null)
            .catch(callback.errorCallback);

        // Trigger a digest on rootScope (needed for $q implementation) 
        $rootScope.$digest();

        expect(callback.errorCallback).toHaveBeenCalled();
    });
于 2016-07-30T14:59:55.037 回答
1

您需要使用 $scope.$apply()(或 $rootScope.$digest())并在调用它之前定义 then()。我修改了你的例子:

describe('promise', function(){
  jasmine.DEFAULT_TIMEOUT_INTERVAL = 500;
  let q;
  let scope;

  beforeEach(inject(function($q, $rootScope){
    q = $q;
    scope = $rootScope.$new();
  }));

  it('finishes', function(done){
    expect(q).toBeDefined();
    const promise = q.resolve();
    promise.then(
      () => done(),
      () => done.fail()
    );
    scope.$apply();
  });
});
于 2016-07-30T15:12:27.717 回答