测试发出API调用的Angularjs服务
我有一个服务,其中包含用于进行异步API调用的代码:测试发出API调用的Angularjs服务,angularjs,jasmine,Angularjs,Jasmine,我有一个服务,其中包含用于进行异步API调用的代码: myApp.factory('ConcernService', function ($http, $q, $rootScope, dateFilter, globals) { var api_url = 'http://' + globals.site_url + '/api/'; var ConcernService = { list: function (items_url) { var defer =
myApp.factory('ConcernService', function ($http, $q, $rootScope, dateFilter, globals) {
var api_url = 'http://' + globals.site_url + '/api/';
var ConcernService = {
list: function (items_url) {
var defer = $q.defer();
$http({method: 'GET',
url: api_url + items_url}).
success(function (data, status, headers, config) {
defer.resolve(data);
}).error(function (data, status, headers, config) {
defer.reject(status);
});
return defer.promise;
},
...
};
});
我正试图为这个方法编写一个Jasmine测试,但事实证明这很棘手,因为我对Angular和Jasmine都是新手
到目前为止,我的测试结果如下:
describe('$http basic', function () {
var $http, $httpBackend, $scope;
beforeEach(module('concernsApp'));
beforeEach(inject(function (_ConcernService_, _$http_, _$httpBackend_) {
ConcernService = _ConcernService_;
$http = _$http_;
$httpBackend = _$httpBackend_;
}));
it('should return all projects', function () {
var projects = [{"id": 2, "title": "FooProject", "created_by": 1}, {"id": 5, "title": "BarProject", "created_by": 1}];
$httpBackend.whenGET('http://localhost:8000/api/projects/')
.respond(projects);
ConcernService.list('projects')
.then(function(data) {
console.log('data', data);
expect(data.length).toEqual(2);
});
$httpBackend.flush();
});
});
这是失败的,但我不完全确定原因。因此,结果表明错误是因为使用了承诺,这意味着在
$httpBackend.flush()之前需要使用apply()
方法代码>。正如JB Nizet正确指出的那样,我的url结构中存在一个不一致的地方,这在解决最初的问题时就暴露了出来
工作守则:
describe('$http basic', function () {
var $http, $httpBackend, $scope;
beforeEach(module('concernsApp'));
beforeEach(inject(function ($rootScope, _ConcernService_, _$httpBackend_) {
ConcernService = _ConcernService_;
$httpBackend = _$httpBackend_;
$scope = $rootScope.$new();
}));
it('should return all projects', function () {
var projects = [{"id": 2, "title": "FooProject", "created_by": 1}, {"id": 5, "title": "BarProject", "created_by": 1}];
$httpBackend.whenGET('http://localhost:8000/api/projects')
.respond(projects);
ConcernService.list('projects')
.then(function(data) {
expect(data.length).toEqual(2);
});
$scope.$apply();
$httpBackend.flush();
});
});
失败消息是怎么说的?ConcernService未定义,因此代码甚至无效。因此,我编辑了description
代码块,以便更明确地说明ConcernService
的来源。我得到的错误是错误:没有挂起的刷新请求代码>。你应该发布你真正的代码。ConcernService仍然没有定义。但问题可能是(除非这部分也不是真实的)请求被发送到../projects
,但是您已经配置了http后端以响应到../projects/
的请求。