2013-01-09 20 views
11

मैं एक नियंत्रक का परीक्षण करने की कोशिश कर रहा हूं जो कोणीय के संसाधन का उपयोग करता है।

function PermissionsCtrl($scope, $resource, $cookies) { 
    var Object = $resource('/v1/objects/:id'); 
    loadObjects(); 

    function loadObjects() { 
    $scope.myAppObjects = new Array(); 

    var data = AppObject.get({find: '{"app_id": '+wtm.app_id+'}'}, 
     function(){ 
     if (data.results) { 
      for(var i = 0; i< data.results.length; i++) { 
      if(!data.results[i].is_deleted) { 
       (function(i){ 
       $scope.objects(data.results[i]); 
       }(i)); 
      } 
      } 
     } 
     }, 
     function(error){console.log(error);}); 
    } 

और यहां परीक्षण कोड है।

var apiServer = "..."; 
var app_id = 999 
var mock_object_data = {...}; 


describe('apps permissionsCtrl', function(){ 
    var scope, ctrl, $httpBackend; 

    // Create a matcher for comparing data 
    beforeEach(function() { 
    this.addMatchers({ 
     toEqualData: function(expected) { 
     return angular.equals(this.actual, expected); 
     } 
    }); 
    }); 

    // Create the controller with injected data/services 
    beforeEach(inject(function(_$httpBackend_, $rootScope, $controller, $resource) { 
    $httpBackend = _$httpBackend_; 
    // cookie data to inject 
    var cookies = new Array(); 
    cookies['id'] = '...'; // just needs to be declared 


    $httpBackend.expectGET(apiServer+'/v1/app_objects? find=%7B%22app_id%22:'+app_id+'+%7D&access_token=' + cookies['id']) 
     .respond(mock_object_data); 

    var $injector = angular.injector(['ng', 'ngResource']); 
    var $resource = $injector.get('$resource'); 

    scope = $rootScope.$new(); 
    ctrl = $controller(PermissionsCtrl, {$scope: scope, $cookies: cookies, $resource: $resource}); 
    })); 

    it('should put object data into $scope', function() { 
    $httpBackend.flush(); 
    expect(scope.objects).toEqualData(mock_object_data); 

}); });

जब मैं इस चलाने मैं लाइन, जहां मैं अपने नियंत्रक बनाने की कोशिश में

Error: Unknown provider: $resourceProvider <- $resource 

मिलता है। मुझे समझ में नहीं आता कि यह मेरे नियंत्रक में इंजेक्ट कैसे करें और इससे कोई फर्क नहीं पड़ता कि मैं क्या त्रुटि करता हूं। मैंने कोशिश की है कि कुछ चीजें हैं

  • एक खाली नकली वस्तु घोषित करना और मेरे कुकीज़ चर के समान इसे गुजरना। मुझे लगता है कि यह वास्तव में एक बुरा समाधान है क्योंकि मैं वास्तव में सेवा का उपयोग करना चाहता हूं।
  • स्कोप मॉक की नकल करना और इसे मेरे इंजेक्शन फ़ंक्शन में पास करना और $ संसाधन पास करना। मेरे नियंत्रक को $ नया()।
  • कुछ भी नहीं कर रहा है और उम्मीद है कि httpBackend इसे कवर करेगा क्योंकि आखिरकार वैसे भी इसे बुलाया जाता है। वोजता जीना ने इसे ध्वनि बनाया जैसे काम करेगा लेकिन कोई पासा नहीं होगा।
  • हल्के उपशीर्षक। संतुष्ट लेकिन बहुत प्रभावी नहीं है। निम्न कोड के साथ $resource का दृष्टांत को

उत्तर

6

अधिक पढ़ने और अधिक यह प्रयोग यह करने के लिए सही तरीके से लगता है के बाद सार करने के लिए $ के उपयोग के नियंत्रक से बाहर संसाधन है। मेरे मामले में मैंने एक सेवा लिखा जो $ संसाधन पर निर्भर करता है और फिर उस सेवा को मेरे नियंत्रक में इंजेक्ट करता है। इस बीच मैं अपने नियंत्रक से अलग से उस सेवा का परीक्षण करता हूं। चारों ओर बेहतर अभ्यास।

मेरी सेवा घोषणा:

angular.module('apiModule', ['localResource', 'ngCookies']) 
.factory('apiService', function($resource, $cookies) { 

और मेरी इकाई परीक्षण में मैं एक beforeEach सेटअप समारोह

beforeEach(module('apiModule')); 
+19

क्या आप एक और पूर्ण कोड नमूना साझा कर सकते हैं? एंगुलर और जैस्मीन के लिए नया व्यक्ति होने के नाते, मुझे इसके चारों ओर अपने सिर को लपेटने में परेशानी होती है। –

+0

@ संक्षिप्त नाम तो आपने नियंत्रक का परीक्षण करने के लिए 'app.js' शामिल किया था? – Deeptechtons

+10

लेकिन क्या आपकी सेवा का परीक्षण करते समय आपको वही समस्या नहीं मिलेगी? –

6

प्रयास करें:

var $injector = angular.injector(['ng', 'ngResource']); 
var $resource = $injector.get('$resource'); 

अन्य सेवाओं, जब वे अभी भी अन्य मॉड्यूल में हैं को छोड़कर के लिए इसी तरह। फिर उस मॉड्यूल को सरणी में जोड़ें।

More info

+0

शायद मैं कुछ यहाँ समझ नहीं कर रहा हूँ में यह माध्यम से गुजरती हैं। मैंने कोशिश की और एक ही परिणाम मिला। मैंने आपके सुझाव को शामिल करने के लिए अपनी मूल पोस्ट अपडेट की। – akronymn

+0

यह पता चला है कि इस समाधान के साथ समस्या यह है कि $ संसाधन वास्तव में एक सेवा नहीं है। यह एक कारखाना है। http://docs.angularjs.org/api/ngResource.$resource – akronymn

संबंधित मुद्दे