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

时间:2016-04-20 09:28:02

标签: angularjs unit-testing karma-jasmine angularjs-factory

我很难从karma单元测试中调用工厂方法。

它说我试图调用的方法(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;
  }
])

任何有关解释的帮助都会非常感激。谢谢

1 个答案:

答案 0 :(得分:1)

这是您的工厂实施而不是测试的问题。 Angular中的工厂应该返回一个对象,而你返回的是一个对象'构造函数'功能

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

return new ZoneData();

而不是返回

return ZoneData;

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

感谢。