2016-04-20 10 views
0

カルマユニットテストからファクトリメソッドを呼び出そうとしています。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; 
    } 
]) 

説明のビットを持つ任意のヘルプは本当に理解されるであろう。ありがとう

+0

実際にZoneData.prototype.load()ではなく、ZoneData.load()だけでなくload()ですか? – Jagrut

+0

ご覧のとおり、私のテストではconsole.logがあり、これが結果です:function(Data){ if(Data){ return this.setData(Data); }どんな方法であれ助けてくれたら } – Nick

+0

私はZonedata.prototype.load()を呼びたいと思うが、私のコントローラでは、このメソッドを以下のように呼んでいる。 $ scope.zones = new ZoneData(); $ scope.zones.load(); – Nick

答えて

1

これは、テストではなく工場での実装に問題があります。 Angularのファクトリはオブジェクトを返すことになっており、返すものはオブジェクトの 'コンストラクタ'関数です。

簡単な解決策は

return new ZoneData();

代わりの

return ZoneData;

を返すように、あなたの工場の戻り値を変更することです。このplunkr http://plnkr.co/edit/O8wnmgSQ8mc9t93jKDJ6?p=previewを確認してください。 私はこのコンセプトを実証するために、工場のストリップされたバージョンを作成しました。

ありがとうございました。

関連する問題