我正在尝试测试一个封装我的API调用的Angular服务。为了测试我正在使用Jasmine
和Karma
。我的测试看起来像这样:
describe('$http basic', function () {
var ConcernService, $httpBackend, $scope;
beforeEach(module('concernsApp'));
beforeEach(inject(function ($injector) {
ConcernService = $injector.get('ConcernService');
$httpBackend = $injector.get('$httpBackend');
$scope = $injector.get('$rootScope').$new();
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);
}));
it('should return all projects', function () {
ConcernService.list('projects')
.then(function(data) {
expect(data.length).toEqual(2);
});
$scope.$apply();
$httpBackend.flush();
});
这失败了,给我一个ConcernService
是未定义的错误。
我尝试将Concernservice
模块直接注入测试:
...
it('should return all projects', function () {
inject(function(ConcernService) {
ConcernService.list('projects')
.then(function(data) {
expect(data.length).toEqual(2);
});
$scope.$apply();
$httpBackend.flush();
});
});
但是现在我得到一个modulerr
,大概来自未知的'ConcernService`模块。
我在这里做错了什么?
var concernsApp = angular.module('concernsApp', [...]);
concernsApp.factory('ConcernService', function ($http, $q, $rootScope, dateFilter, globals) {
...
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;
},
...
};
return ConcernService;
});
答案 0 :(得分:1)
好的,所以在离开它并回来之后我终于找到了问题的根源;)
解决方案是双重的。我决定更换Karma运行的浏览器(我在Debian上,最简单的浏览器是FF)。我改为Chrome,突然间我得到了更好的错误消息。在FF仅表明ConcernService
为undefined
的情况下,Chrome通知我我缺少某些依赖项(本地js文件)。一旦我纠正了这些,我的所有测试都通过了!!!
谢谢所有花时间帮助我的人。我发布这个答案只是希望它可能对别人有用。
答案 1 :(得分:0)
我们用这种方式进行测试,试试看:
beforeEach(module('concernsApp'));
beforeEach(inject(function (ConcernService) {
...
}));