最后承诺条款永远不会在Jasmine测试中执行

时间:2017-01-03 10:43:11

标签: angularjs jasmine angular-promise

我有这个茉莉花测试,并且承诺的finally子句似乎没有被执行,因为我收到了错误:

PhantomJS 2.1.1 (Mac OS X 0.0.0) Service: petsFactory .getPetsAsync() should return a list of pets FAILED
    Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.

我的测试文件如下:

'use strict';

describe('Service: petsFactory', function () {

  // load the service's module
  beforeEach(module('smokeTestApp'));

  // instantiate service
  var petsFactory;
  beforeEach(inject(function (_petsFactory_) {
    petsFactory = _petsFactory_;
  }));

  describe('.getPetsAsync()', function () {
    it('should return a list of pets', function (done) {

      var testPets = function (pets) {
        expect(Array.isArray(pets)).toBe(true);
      }

      var failTest = function(error) {
        expect(error).toBeUndefined();
      };

      petsFactory
        .getPetsAsync()
        .then(testPets)
        .catch(failTest)
        .finally(done);
    });
  });
});

相关工厂方法如下:

var getPetsAsync = function () {
    return $q.when(pets);
};

pets变量的内容是完全同步的,promise只是立即存在的同步值的包装。

这里出了什么问题?

1 个答案:

答案 0 :(得分:1)

来自documentation

  

在测试承诺时,重要的是要知道它的分辨率   承诺与摘要周期有关。这意味着一个承诺,那么,   catch和finally回调函数仅在摘要后调用   跑了。在测试中,您可以通过调用范围来触发摘要   $ apply函数。如果您的测试中没有范围,则可以   注入$ rootScope并调用$ apply。还有一个例子   在$ q服务文档中测试promise。

只需注入$rootScope并使用$apply

petsFactory
  .getPetsAsync()
  .then(testPets)
  .catch(failTest)
  .finally(done);

$rootScope.$apply();