2013-08-11 13 views
11

मैं अपने कुछ HTTP अनुरोधों को पारित करना चाहता हूं और उन्हें अपने यूनिट परीक्षण में नकल नहीं करना चाहता, लेकिन जब मैं passThrough() विधि को कॉल करने का प्रयास करता हूं, तो गायब विधि की त्रुटि फेंक दिया गया है:

"TypeError: Object # has no method 'passThrough'".

क्या कोई जानता है कि मैं इसे कैसे ठीक कर सकता हूं?

मेरी कोड है:

'use strict'; 

describe('Controller: MainCtrl', function() { 

    // load the controller's module 
    beforeEach(module('w00App')); 

    var scope, MainCtrl, $httpBackend; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function(_$httpBackend_, $rootScope, $controller) { 
     $httpBackend = _$httpBackend_; 
     $httpBackend.expectGET('http://api.some.com/testdata.json').passThrough(); 


     scope = $rootScope.$new(); 
     MainCtrl = $controller('MainCtrl', { 
      $scope: scope 
     }); 
    })); 
}); 
+3

के रूप में [प्रलेखन] में विस्तार से बताया (http://docs.angularjs.org/api/ngMock.$httpBackend): * इकाई परीक्षण के दौरान, हम हमारे इकाई परीक्षण जल्दी से चलाना चाहते हैं और कोई बाहरी निर्भरता है इसलिए हम एक वास्तविक सर्वर * के लिए एक्सएचआर या जेएसओएनपी अनुरोध नहीं भेजना चाहते हैं। यूनिट परीक्षणों में उपयोग की जाने वाली $ httpBackend सेवा पास नहीं हो सकती है। एंड-टू-एंड टेस्ट द्वारा उपयोग किए जाने वाले $ httpBackend हालांकि, कर सकते हैं। –

+6

यह बाहरी टेम्पलेट्स के साथ परीक्षण निर्देशों की आवश्यकता से अधिक कठिन बनाता है, क्या आपको नहीं लगता? – SimplGy

उत्तर

4

आप विकास के दौरान अपने बैकएंड उपहास करने के लिए, बस अपने मुख्य html फ़ाइल में angular-mocks स्थापित करते हैं, आपके आवेदन (angular.module('myApp', ['ngMockE2E'])) में यह जोड़ एक निर्भरता के रूप में और फिर अनुरोध नकली चाहते हैं आपको।

उदाहरण के लिए,

angular.module('myApp') 
    .controller('MainCtrl', function ($scope, $httpBackend, $http) { 
    $httpBackend.whenGET('test').respond(200, {message: "Hello world"}); 
    $http.get('test').then(function(response){ 
     $scope.message = response.message //Hello world 
    }) 
    }); 

हालांकि सावधान रहें, कि ngMockE2E जोड़ने क्या आप AngularJS मार्ग के माध्यम से ऐसा करने के मामले में अपने रूट सेट करने की आवश्यकता होगी।

उदाहरण;

angular.module('myApp', ['ngMockE2E']) 
    .config(function ($routeProvider) { 
    $routeProvider 
     .when('/', { 
     templateUrl: 'views/main.html', 
     controller: 'MainCtrl' 
     }) 
     .otherwise({ 
     redirectTo: '/' 
     }); 
    }) 
    .run(function($httpBackend){ 
    $httpBackend.whenGET('views/main.html').passThrough(); 
    }) 
+11

आपको अपने ऐप की निर्भरता के रूप में कोणीय-मोक्स नहीं जोड़ना चाहिए, लेकिन इसे अपने karma.conf में उपयोग करें। फिर पहले से (मॉड्यूल (...)) 'ngMockE2E' में पास करें। – gonzofish

+4

+1 गोंजोफ़िश। बस पहले से जोड़ें (फ़ंक्शन() {मॉड्यूल ('ngMockE2E');}); आपके परीक्षण में परीक्षण सामग्री के साथ अपने ऐप को प्रदूषित करने की कोई आवश्यकता नहीं है। – benek

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