angularjs - модульное тестирование, невозможно вызвать фабричный метод

Я с трудом пытаюсь вызвать фабричный метод из модульного теста кармы.

Это говорит о том, что метод, который я пытаюсь вызвать (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 ответ

Решение

Это проблема с вашей заводской реализацией, а не с тестом. Предполагается, что фабрика в Angular возвращает объект, а то, что вы возвращаете, является функцией конструктора объекта.

Простым решением было бы изменить возвращаемое значение вашей фабрики на

return new ZoneData();

вместо возвращения

return ZoneData;

Пожалуйста, проверьте этот plunkr http://plnkr.co/edit/O8wnmgSQ8mc9t93jKDJ6?p=preview. Я создал урезанную версию фабрики, чтобы продемонстрировать концепцию.

Благодарю.

Другие вопросы по тегам