我有一个用Angular 1.3编写的项目,其中的服务相互继承。有一个BaseApiService
,它是一个父类,它实现了很多与API调用相关的功能。它看起来像这样:
.factory('BaseApiService', function ($resource, apiHost, apiUrl, WebSocketService, $q, $timeout) {
//initializer
return function (resourceName, options) {
options = angular.extend({}, {
resourceUrl: resourceName + '/:id',
resourceParams: {id: '@id'},
resourceMethods: {
'get': {method:'GET'},
'update': {method:'PUT'},
'save': {method:'POST'},
'all': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'}
}
}, options);
this.loadCache = function () {
//...
};
this.new = function () {
//...
};
this.get = function (id) {
//...
};
this.getBy = function (propertyName, value) {
//...
};
this.all = function (params) {
//...
};
//lots of other methods here
然后有多个子类实现对特定API端点的访问。它们是这样做的:
.factory('HandymanTasks', function(BaseApiService, $q){
var service = new BaseApiService('handyman_tasks');
angular.extend(service, {
getByRoomId: function(room_id){
return service.getBy('room_id', room_id);
},
capturePhoto: function() {
//...
}
});
return service;
});
子服务大部分使用父服务的方法,只添加一些自己的方法。父类只是为了继承而实例化,它不能单独使用。我的问题是:如何在这种情况下正确地编写测试?我需要确保所有的API访问函数在所有子类的工作。我的想法是:
- 编写一个助手,测试所有API访问函数(在父类中实现),然后在所有子类的测试中调用它;在父类中测试API调用,假设它们在子类中工作,因为我知道它们总是被继承的。只测试子类中自己的函数;
- 测试子类是否定义了父类的所有方法,假设它们正常工作,因为父类被测试覆盖;
基本上,我只是想确保子类的所有功能都能正常工作,但不要在每个类的测试套装中有太多复制粘贴/非常相似的测试。
我认为测试父服务,然后只测试特定于子服务的函数/属性的方法会很好。您的基本服务函数实际上只需要测试一次,因为每个子函数调用相同的函数,因此测试每个子函数是不必要的。