2013-10-21 13 views
28

में चल रहे कोणीय परीक्षणों में टाइमआउट कैसे काम करता है मुझे शायद प्रतिक्रिया के लिए कंसोल लॉग का उपयोग करना अच्छा लगता है, और कभी-कभी मैं कोड में चला जाता हूं कि सम्मेलन के रूप में हमने निर्देश/सेवा/नियंत्रक में $ टाइमआउट जोड़ा है, कभी-कभी 500 एमएस के रूप में, और अब समस्या यूनिट परीक्षण के दौरान है, मैंने देखा कि केवल कंसोल.लॉग सीधे इसके तहत कन्स्ट्रक्टर को कर्म और आउटपुट को स्क्रीन पर भेज दिया जाता है।कर्मा

टाइमआउट के तहत लपेटा कंसोल लॉग या $ टाइमआउट के तहत लपेटा गया दावा किसी भी परिणाम को उपज नहीं करता है, जैसे कि समय-समय पर समाधान क्या है?

उत्तर

88

अपने यूनिट परीक्षणों में, आप ngMock लोड करते हैं, जो अपने नकली के साथ संरेखण $timeout को ओवरराइट करता है। मॉक $timeout वास्तविक जावास्क्रिप्ट timeout की तरह काम नहीं करता है। इसे अंदर के कोड को कॉल करने के लिए, आपको अपने यूनिट परीक्षण से $timeout.flush() करना होगा।

तो $timeout असली timeout की तरह काम किया, आप सभी कार्यों कि $timeout का उपयोग के लिए अतुल्यकालिक इकाई परीक्षण लिखने के लिए मिला है जाएगा।

यहाँ एक सरलीकृत समारोह $timeout का उपयोग करता है का एक उदाहरण है और मैं इसे कैसे परीक्षण:

gaApi.getReport = function() { 
    report = $q.defer() 

    $timeout(function() { 
    $http({method: 'GET', url: 'https://www.googleapis.com/analytics/v3/data/ga'}) 
     .success(function(body) { 
     report.resolve(body) 
     }) 
    }, 300) 

    return report.promise 
} 

एक इकाई परीक्षण:

describe('getReport', function() { 
    it('should return report data from Google Analytics', function() { 
    gaApi.getReport().then(function(body) { 
     expect(body.kind).toBe('analytics#gaData') 
    }) 

    $timeout.flush() 
    $httpBackend.flush() 
    }) 
}) 
+6

IMHO कोणीय टीम सही है कि लेखन अतुल्यकालिक परीक्षण में है बेकार है। 'फ्लश()' एफटीडब्ल्यू। – weltschmerz

+1

मैं एक ऐसे लेख में आया जो परीक्षण के शीर्ष पर $ timeout.flush का उपयोग करता है, इसके बाद इसका विरोध किया जाता है। इस दृष्टिकोण में क्या अंतर है? http://jasonwatmore.com/post/2015/03/06/AngularJS-Unit-Testing-code-that-uses-$timeout.aspx – Winnemucca

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