如何为具有继承的类编写测试

时间:2015-06-08 13:03:58

标签: angularjs unit-testing inheritance tdd jasmine

我有一个用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调用,假设它们在子类中工作,因为我知道它们总是被继承。仅测试子类中自己的功能;
  • 测试子项是否已定义父项的所有方法,假设它们正常工作,因为父类已被测试覆盖;

基本上,我只是想确保子类的所有功能都能正常工作,但是在每个类的测试套件中没有太多的复制粘贴/非常相似的测试。

1 个答案:

答案 0 :(得分:1)

我认为你可以使用测试父服务的方法,然后只测试特定于子服务的函数/属性。您的基本服务功能实际上只需要测试一次,因为每个孩子都调用相同的功能,因此测试每个功能都是不必要的。