angularjs - 单元测试,无法调用工厂方法

angularjs - unit test, unable to call factory method

我很难尝试从业力单元测试调用工厂方法。

它说我尝试调用的方法 (load()) 不存在。

代码如下:

unitTest.js

describe('Data Factory', function() {
  var DataFactory, scope, spy;

  beforeEach(module('App'));

  beforeEach(inject(function($injector, $rootScope, _ZoneData_) {
    var DataFromjson;
    scope = $rootScope.$new();
    DataFromjson = _ZoneData_;
    return spy = spyOn(DataFromjson, 'load');
  }));

  return it('Should Load the right data from the json file', function() {
    var test;
    test = DataFactory;
    console.log(test);
    return expect(DataFactory).toBeDefined();
  });
});

这是工厂代码:

angular.module('services', ['ngResource']).factory('ZoneData', [
  '$http', '$stateParams', function($http, $stateParams) {
    var ZoneData;
    ZoneData = function(Data) {
      if (Data) {
        return this.setData(Data);
      }
    };
    ZoneData.prototype = {
      setData: function(Data) {
        return angular.extend(this, Data);
      },
      load: function(id) {
        var scope;
        scope = this;
        return $http.get('default-system.json').success(function(Data) {
          return scope.setData(Data.data);
        }).error(function(err) {
          return console.error(err);
        });
      },
      filtered: function() {
        var scope;
        scope = this;
        return $http.get('default-system.json').success(function(Data) {
          return angular.forEach(Data.data, function(item) {
            var urlZoneId;
            urlZoneId = parseInt($stateParams.zoneID);
            if (item.iID === urlZoneId) {
              return scope.setData(item);
            }
          });
        });
      }
    };
    return ZoneData;
  }
])

如果您能提供一些解释,我们将不胜感激。谢谢

这是你的工厂实现问题,而不是测试问题。 Angular 中的工厂应该 return 一个对象,而你 returning 是一个对象 'constructor' 函数。

一个简单的解决方案是将工厂的 return 值更改为

return new ZoneData();

而不是 returning

return ZoneData;

请检查这个 plunkr http://plnkr.co/edit/O8wnmgSQ8mc9t93jKDJ6?p=preview。 我创建了一个精简版的工厂来演示这个概念。

谢谢。