我正在使用角度扩展承诺作为其依赖项之一来测试角度服务。它看起来像这样:
angular.module('main')
.service('MyService', ['_', '$q', 'DatabaseService',
function(_, $q, DatabaseService) {
function loadResources(resources) {
var resources = _.mapValues(resources, function(config, type) {
return DatabaseService.getByType(type)
.then(function(data) {
return index(type, data);
});
});
return $q.props(resources);
});
var service = {
loadResources: loadResources
};
return service;
}
])
;
我想对loadResources函数进行测试,对于这个我的存根DatabaseService.getByType函数。我正在使用摩卡,柴,sinon在业力上运行。我的测试看起来像这样:
describe('[Service] MyService', function() {
var MyService, DatabaseService, $q;
var databaseBrand = [...]; // My fixtures
beforeEach(function() {
module('myApp');
inject(function($injector) {
MyService = $injector.get('MyService');
DatabaseService = $injector.get('DatabaseService');
$q = $injector.get('$q');
sinon.stub(DatabaseService, 'getByType', function(type) {
var typeResources = databaseBrand.filter(function(resource) {
return resource.type === type;
});
return $q.resolve(typeResources);
});
});
});
afterEach(function() {
DatabaseService.getByType.restore();
});
it('loadResources method', function() {
var configTest = { resources: [...] }; // input test data
var promise = MyService.loadResources(configTest);
return promise.should.be.fulfilled
.then(function(brandResources) {
console.log('PROMISE RESOLVED');
expect(brandResources).to.be.an('object');
// Other expects
})
;
});
});
当我运行测试时,我有这个超时:
PhantomJS 2.1.1 (Mac OS X 0.0.0) [Service] MyService loadResources method FAILED
timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
当人们建议使用rootScope的。$ apply()或$ digest()来“强制”解析承诺时,我已经看过一些帖子。但问题是我正在测试一项服务,并且我希望将其隔离以进行测试而不需要任何其他有线行为。
我已经修改了在beforeEach期间恢复$ rootScope并在afterEach中强制$ digest并显示我在测试中添加的日志(什么是酷)但是我有一些错误,试图请求一些未包含在我的场景中的资源......
PhantomJS 2.1.1(Mac OS X 0.0.0)[服务] MyService“之后 每个“hook for”loadResources方法“FAILED意外请求:GET / api / config不再需要请求 $httpBackend@bower_components/angular-mocks/angular-mocks.js:1211:90 sendReq@bower_components/angular/angular.js:10333:21 serverRequest@bower_components/angular/angular.js:10045:23 [native 代码] processQueue@bower_components/angular/angular.js:14567:30 bower_components /角度/ angular.js:14583:39 $eval@bower_components/angular/angular.js:15846:28 $digest@bower_components/angular/angular.js:15657:36 $apply@bower_components/angular/angular.js:15951:31
有没有办法避免使用这个$ digest或$ apply?如果我在服务中而不是控制器,为什么我必须这样做以允许$ q.prop解决这个承诺?
由于