2013-03-20 10 views
7

का उपयोग करता है मेरे पास एक साधारण नियंत्रक है और पहली चीज़ जो मुझे करने की ज़रूरत है वह दायरे के लिए एक मूल्य असाइन करता है।

function TestCtrl($scope, $http) { 
    $scope.listForms = 'some list'; 
} 

नियंत्रक के लिए निम्नलिखित परीक्षण के रूप में उम्मीद काम करता है:

describe('Testing a controller', function() { 

    var ctrl, scope, httpMock; 

    beforeEach(inject(function($injector) { 
     scope = $injector.get('$rootScope').$new(); 
     ctrl = $injector.get('$controller'); 
     ctrl(TestCtrl, { $scope: scope }); 
    })); 

    it("assigns to scope", function() { 
     expect(scope.listForms).toMatch("some list"); 
    }); 
}); 

लेकिन जब मैं समारोह बदल मेरी एपीआई

function TestCtrl($scope, $http) { 
    $http.get('/api/listForms').success(function(list) { 
    $scope.aListOfForms = 'some list'; 
    }); 
} 

और

को परीक्षण परिवर्तन से सूची प्राप्त करने के
describe('Testing a controller', function() { 

    var ctrl, scope, httpMock; 

    beforeEach(inject(function($injector) { 
     httpMock = $injector.get('$httpBackend'); 

     scope = $injector.get('$rootScope').$new(); 
     httpMock.when('GET', '/tactical/api/listOrderForms').respond("an order form"); 

     ctrl = $injector.get('$controller'); 
     ctrl(TestCtrl, { 
      $scope: scope, 
      $http: httpMock 
     }); 
    })); 

    it("gets the list from the api and assigns it to scope", function() { 
     httpMock.expectGET('tactical/api/listOrderForms'); 
     expect(scope.orderFormList).toMatch("an order form"); 
     httpMock.flush(); 
    }); 
}); 

मैं ge निम्नलिखित त्रुटियों में नहीं:

TypeError: 'undefined' is not a function 
Expected undefined to match 'an order form'. 
Error: No pending request to flush ! 

क्या कोई जानता है कि मैं क्या गलत कर रहा हूं? अग्रिम में धन्यवाद।

उत्तर

8

$ http बाहरी संसाधनों से बात करने के लिए $httpBackend का उपयोग करता है। आपने $httpBackend का मज़ाक उड़ाया है, लेकिन नियंत्रक को अभी भी $http एस इंटरफ़ेस से बात करने की आवश्यकता है।

यह करना चाहिए:

describe('Testing a controller', function() { 

    var ctrl, scope, httpMock; 

    beforeEach(inject(function($controller, $rootScope, $httpBackend) { 
     httpMock = $httpBackend; 

     scope = $rootScope.$new(); 
     httpMock.when('GET', '/tactical/api/listOrderForms').respond("an order form"); 

     ctrl = $controller; 
     ctrl(TestCtrl, { 
      $scope: scope 
     }); 
    })); 

    it("gets the list from the api and assigns it to scope", function() { 
     httpMock.expectGET('tactical/api/listOrderForms'); 
     httpMock.flush(); 
     expect(scope.orderFormList).toMatch("an order form"); 
    }); 
}); 
+0

धन्यवाद जिसने वास्तव में मदद की है, मुझे मूर्खतापूर्ण। –

+0

लेकिन कहीं भी आपने $ httpBackend के वास्तविक कार्यान्वयन को संशोधित नहीं किया है। तो एंगुलर को कॉल करने के बारे में पता नहीं है (जो कुछ भी) असली $ httpBackend ऑब्जेक्ट पर विधियां हैं, लेकिन इसके बजाय httpMock को कॉल करते समय httpMock को कॉल करें? मैं यहां बहुत उलझन में हूं (कोणीय से नया) – Nikhil

+1

निखिल, $ http $ http बैकएंड के लिए पूछेगा जब $ http प्रारंभ हो जाएगा। $ httpBackend एक सिंगलटन है (केवल एक उदाहरण मौजूद है) और httpMock इसका संदर्भ है। इस $ httpBackend इंस्टेंस पर कॉलबैक पंजीकृत करना और सामान करना जो परीक्षण और $ http के बीच साझा किया जाता है, यह काम करता है। –

0

आपको उम्मीद से पहले httpMock.flush() को कॉल करने की आवश्यकता है()। फ्लश कॉल "बैक एंड" से लौटने वाली प्रतिक्रिया को अनुकरण करती है, जो http अनुरोध से जुड़ी सफलता समारोह को बुलाती है।

+0

मैं कारण यह है कि फ्लश() था पहले जाने के लिए नहीं पता था, इसलिए मैं कुछ, थक यह दोनों तरीकों और मैं अभी भी एक ही त्रुटियाँ प्राप्त सीख लिया है। –

3

आप अपने नियंत्रक के लिए $ httpBackend सेवा के रूप में $ http सेवा को प्रतिस्थापित नहीं कर सकते हैं।

बदलें

ctrl(TestCtrl, { 
     $scope: scope, 
     $http: httpMock 
    }); 

ctrl(TestCtrl, { 
     $scope: scope 
    }); 

को यह काम करना चाहिए।

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