【发布时间】:2015-07-07 10:46:46
【问题描述】:
我正在尝试测试一个 Angular 服务,它有 2 个依赖项,一个在 $q 上,另一个在 'myService' 上,它也依赖于 $q。
(function() {
'use strict';
angular.module('myModule').factory('myService', [
'$q',
'apiService',
function($q, apiService) {
var data = null;
function getData() {
var deferred = $q.defer();
if (data === null) {
apiService.get('url').then(function(result) {
data = result;
deferred.resolve(data);
}, function() {
deferred.reject();
});
} else {
deferred.resolve(data);
}
return deferred.promise;
}
return {
getData: getData
};
}
]);
})();
我开始编写 Jasmine 测试,如下所示,但是在模拟 $q 时遇到了问题。我想将 $q 的真实版本而不是模拟版本注入“myService”和“apiService”,但不知道如何实现。
'use strict';
describe('My service', function() {
var qSpy, apiServiceSpy;
beforeEach(module('myModule'));
beforeEach(function() {
qSpy = jasmine.createSpyObj('qSpy', ['defer']);
apiServiceSpy = jasmine.createSpyObj('apiServiceSpy', ['get']);
apiServiceSpy.get.and.callFake(function() {
var deferred = $q.defer();
deferred.resolve('Remote call result');
return deferred.promise;
});
module(function($provide) {
$provide.value('$q', qSpy);
$provide.value('apiService', apiServiceSpy);
});
});
it('should get data.', inject(function(myService) {
// Arrange
// Act
var data = myService.getData();
// Assert
expect(data).not.toBeNull();
}));
});
编辑 这是基于以下响应的更新测试。我想我的问题是我认为我必须提供 $q。
'use strict';
describe('My service', function() {
var service, apiServiceSpy;
beforeEach(module('myModule'));
beforeEach(function() {
apiServiceSpy = jasmine.createSpyObj('apiServiceSpy', ['get']);
module(function($provide) {
$provide.value('apiService', apiServiceSpy);
});
});
beforeEach(inject(function($q, myService) {
service = myService;
apiServiceSpy.get.and.callFake(function() {
var deferred = $q.defer();
deferred.resolve('Remote call result');
return deferred.promise;
});
}));
it('should get data.', function() {
// Arrange
// Act
var data = service.getData();
// Assert
expect(data).not.toBeNull();
}));
});
【问题讨论】:
-
你为什么要嘲笑
$q?只使用真正的$q有什么问题
标签: javascript angularjs unit-testing jasmine angular-promise