我有这个茉莉花测试,并且承诺的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只是立即存在的同步值的包装。
这里出了什么问题?
答案 0 :(得分:1)
在测试承诺时,重要的是要知道它的分辨率 承诺与摘要周期有关。这意味着一个承诺,那么, catch和finally回调函数仅在摘要后调用 跑了。在测试中,您可以通过调用范围来触发摘要 $ apply函数。如果您的测试中没有范围,则可以 注入$ rootScope并调用$ apply。还有一个例子 在$ q服务文档中测试promise。
只需注入$rootScope
并使用$apply
:
petsFactory
.getPetsAsync()
.then(testPets)
.catch(failTest)
.finally(done);
$rootScope.$apply();