2013-07-02 11 views
19

हम कर्मियों को हमारी कोणीय सेवाओं का परीक्षण करने के लिए कर्म का उपयोग करते हैं, इन सेवाओं में $ http कॉल हैं, इसलिए हमारे पास $ httpbackend मॉक किया गया है ताकि हम बिना सर्वर और डीबी के ऐप चला सकें। यह ठीक काम करता है, एक सेवा $ http ("someurl? Id = 1234") कॉल कर सकती है और हमें सही डेटा वापस मिल जाता है।कोणीय 1.1.5 परीक्षण वादा-आधारित सेवा

getAllowedTypes: function (contentId) { 
    var deferred = $q.defer(); 
    $http.get(getChildContentTypesUrl(contentId)) 
     .success(function (data, status, headers, config) { 
      deferred.resolve(data); 
     }). 
     error(function (data, status, headers, config) { 
      deferred.reject('Failed to retreive data for content id ' + contentId); 
     }); 
    return deferred.promise; 
} 
:

लेकिन जब हम इकाई परीक्षण में एक ही बात करने की कोशिश है, हम इसे काम करने के लिए नहीं मिल सकता है, वादा कभी नहीं का समाधान करता है, जब यह $ http

सेवा शामिल है

मज़ाक उड़ाया $ httpbackend

$httpBackend 
    .whenGET(mocksUtills.urlRegex('/someurl')) 
    .respond(returnAllowedChildren); //returns a json object and httpstatus:200 

परीक्षण

it('should return a allowed content type collection given a document id', function(){ 

    var collection; 
    contentTypeResource.getAllowedTypes(1234).then(function(result){ 
     collection = result; 
    }); 

    $rootScope.$digest(); 

    expect(collection.length).toBe(3); 
}); 

लेकिन संग्रह अपरिभाषित है, तो फिर() कभी नहीं कहा जाता है।

काफी सब कुछ करने की कोशिश की को हल करने, $ rootScope वादा प्राप्त करने के लिए। $ (लागू), $ पचाने, $ httpBacke.flush(), लेकिन कुछ भी

तो मज़ाक उड़ाया काम करता है $ httpBackend जब में नियंत्रकों से कहा जाता है काम करता है ऐप, लेकिन जब सेवाओं को सीधे कर्म इकाई परीक्षणों में नहीं कहा जाता है

उत्तर

7

आपको दो बार पचाने की आवश्यकता नहीं है, क्योंकि $ httpBackend.flush() कॉल खुद को पचता है। आपको कॉल इंटरसेप्टर, कॉल फ्लश को हल करने के लिए कॉल करना है, डाइजेस्ट कॉल करना है।

यहाँ एक काम कर Plnkr है: http://plnkr.co/edit/FiYY1jT6dYrDhroRpFG1?p=preview

+1

किज़ डी कुटर ने नीचे एक और जवाब में टिप्पणी की कि $ रूटस्कोप की आवश्यकता नहीं है। मैंने plunkr फोर्क किया और सभी $ rootScope उपयोगों पर टिप्पणी की। परीक्षण अभी भी गुजरता है: http://plnkr.co/edit/4ladJi7TAQ4sFdzuGmDr?p=preview – chashi

4

अपने मामले में, आपको $ 92Backend के लिए दो बार, और फिर अपने स्वयं के स्थगित होने के लिए दो बार पचाना होगा।

तो:

it('should return a allowed content type collection given a document id', function(){ 

    var collection; 
    contentTypeResource.getAllowedTypes(1234).then(function(result){ 
     collection = result; 
    }); 
    $httpBackend.flush(); 
    $rootScope.$digest(); 

    expect(collection.length).toBe(3); 
}); 
+0

की कोशिश की .flush() पहले से ही है, लेकिन हो जाता है: "त्रुटि: फ्लश करने के लिए कोई लंबित अनुरोध!" यह 1.1.4 के बाद से एक आम त्रुटि प्रतीत होता है: https://github.com/angular/angular.js/issues/2431 –

+0

ऑर्डर गलत है, आपको फ्लश करने से पहले $ पचाने की आवश्यकता है। – user553086

4

आप बहुत करीब हैं। आपके मामले में, आपको HTTP बैकएंड को फ़्लश करने से पहले केवल एक पाचन चक्र को मजबूर करने की आवश्यकता है। नीचे नमूना कोड देखें।

it('should return a allowed content type collection given a document id', function(){ 

    var collection; 
    contentTypeResource.getAllowedTypes(1234).then(function(result){ 
     collection = result; 
    }); 

    $rootScope.$digest(); 
    $httpBackend.flush(); 
    expect(collection.length).toBe(3); 
}); 
+0

यह है। फ्लश() संख्या $ फ्लश() बीटीडब्ल्यू, और नहीं, काम नहीं करता है, "फ्लश करने के लिए कोई लंबित अनुरोध नहीं" त्रुटि प्राप्त करें, देखें: https://github.com/angular/angular.js/issues/2431 –

+2

$ rootScope। $ digest() आईएमओ आवश्यक नहीं है यदि आप अलगाव में एक सेवा का परीक्षण कर रहे हैं। –

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