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. Я создал урезанную версию фабрики, чтобы продемонстрировать концепцию.
Благодарю.