2016-04-20 11 views
0

Ich habe Schwierigkeiten, eine Factory-Methode vom Karma-Unit-Test aus aufzurufen.angularjs - Komponententest, unfähig, Factory-Methode aufzurufen

Es besagt, dass die Methode, die ich aufrufen möchte (load()) nicht existiert.

Hier ist der Code:

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(); 
    }); 
}); 

und hier ist der Werkscode:

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; 
    } 
]) 

jede Hilfe mit etwas Erklärung wird wirklich, wirklich geschätzt. Danke

+0

Ist nicht load() eigentlich ZoneData.prototype.load() und nicht nur ZoneData.load()? – Jagrut

+0

Wie Sie sehen können, habe ich eine console.log in meinem Test, und das ist das Ergebnis: Funktion (Daten) { if (Data) { Rückgabe this.setData (Data); } Wenn es in irgendeiner Weise hilft } – Nick

+0

Ich möchte Zonedata.prototype.load() aufrufen, in meinem Controller, rufe ich diese Methode wie folgt auf: $ scope.zones = new ZoneData(); $ scope.zones.load(); – Nick

Antwort

1

Dies ist ein Problem mit Ihrer Fabrik Implementierung und nicht den Test. Eine Factory in Angular soll ein Objekt zurückgeben, und was Sie zurückgeben, ist eine Konstruktorfunktion des Objekts.

Eine einfache Lösung wäre, den Rückgabewert Ihrer Fabrik zu ändern

return new ZoneData();

zu sein, anstatt Rückkehr

return ZoneData;

Bitte überprüfen Sie diese plunkr http://plnkr.co/edit/O8wnmgSQ8mc9t93jKDJ6?p=preview. Ich habe eine abgespeckte Version der Fabrik erstellt, nur um das Konzept zu demonstrieren.

Danke.