2016-10-19 15 views
25

का उपयोग कब करें 0 कोणीय 2 में परीक्षण करते समय टेस्टबैड में एसिंक फ़ंक्शन का उपयोग कब करते हैं?कोणीय 2 परीक्षण - Async फ़ंक्शन कॉल -

आप इसका उपयोग कब करते हैं?

beforeEach(() => { 
     TestBed.configureTestingModule({ 
      declarations: [MyModule], 
      schemas: [NO_ERRORS_SCHEMA], 
     }); 
    }); 

और आप इसका उपयोग कब करते हैं?

beforeEach(async(() => { 
     TestBed.configureTestingModule({ 
      declarations: [MyModule], 
      schemas: [NO_ERRORS_SCHEMA], 
     }); 
    })); 

क्या कोई मुझे इस पर प्रबुद्ध कर सकता है?

उत्तर

32

async देखें अगले परीक्षण async खत्म सब यह कार्य जब तक शुरू करने के लिए नहीं की अनुमति देगा। async जोन में कॉलबैक लपेटता है, जहां सभी असीमित कार्य (उदा। setTimeout) ट्रैक किए जाते हैं। एक बार सभी एसिंक्रोनस कार्य पूरा हो जाने के बाद, async पूर्ण हो जाता है।

क्या तुमने कभी बाहर कोणीय बाहर जैस्मीन के साथ काम किया है, तो आप done देखा हो सकता है कॉलबैक

it('..', function(done) { 
    someAsyncAction().then(() => { 
    expect(something).toBe(something); 
    done(); 
    }); 
}); 

यहाँ करने के लिए पारित किया जा रहा है, इस जन्म का जैस्मीन, जहां हम जैस्मीन बताया कि इस परीक्षा में जब तक पूरा होने में देरी करना चाहिए हम done() पर कॉल करते हैं। हम क्या नहीं किया, तो इस

it('..', function() { 
    someAsyncAction().then(() => { 
    expect(something).toBe(something); 
    }); 
}); 

परीक्षण, यहां तक ​​कि उम्मीद से पहले पूरा होगा क्योंकि वादा निराकरण के बाद परीक्षण समाप्त तुल्यकालिक कार्यों के क्रियान्वयन कर रहा है।

कोणीय (जैस्मीन पर्यावरण में) के साथ, कोणीय दृश्यों के पीछे वास्तव में done पर कॉल करेंगे, जब हम async का उपयोग करते हैं। यह ज़ोन में सभी एसिंक्रोनस कार्यों का ट्रैक रखेगा, और जब वे सभी समाप्त हो जाएंगे, तो done दृश्यों के पीछे बुलाए जाएंगे।

TestBed कॉन्फ़िगरेशन के साथ अपने विशेष मामले में, आप आमतौर पर इसका उपयोग करेंगे जब आप compileComponents चाहते हैं।मैं शायद ही कभी एक स्थिति में चलाने जिसमें मैं इसे कहते हैं अन्यथा

beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
    declarations: [MyModule], 
    schemas: [NO_ERRORS_SCHEMA], 
    }) 
    .compileComponent().then(() => { 
     fixture = TestBed.createComponent(TestComponent); 
    }); 
})); 

जब एक घटक templateUrl का उपयोग करता है (यदि आप webpack उपयोग नहीं कर रहे) परीक्षण करना, फिर कोणीय टेम्पलेट प्राप्त करने के लिए एक XHR अनुरोध करने की जरूरत के लिए होता है , इसलिए घटक का संकलन असीमित होगा। इसलिए हमें परीक्षण जारी रखने का संकल्प होने तक प्रतीक्षा करनी चाहिए।

+0

ग्रेट उत्तर @peeskillet। बस यह सुनिश्चित करने के लिए कि मैं इसे समझता हूं: जब आपके पास इनलाइन टेम्पलेट होता है, तो 'async' आवश्यक नहीं है। जब आप 'templateUrl' का उपयोग कर रहे हैं, तो यह है। हालांकि, 'async' सहित एक इनलाइन-टेम्पलेट घटक "ब्रेक" नहीं होगा। क्या आपको लगता है कि यह कहना सुरक्षित है कि कोई भी प्रत्येक परीक्षण के लिए 'async' का उपयोग करने के लिए डिफ़ॉल्ट हो सकता है? – vincecampanale

+1

@vincecampanale टेम्पलेटउआरएल केवल पहले से कॉन्फ़िगरेशन के दौरान मायने रखता है। इस मामले में आपको 'compileComponents' को कॉल करने की आवश्यकता है। यदि आप यही पूछ रहे हैं तो प्रत्येक परीक्षण पर 'async' का उपयोग करने के साथ इसका कोई लेना-देना नहीं है। जहां तक ​​सुरक्षित है (जब आपको 'compileComponents'' कॉल करना चाहिए, तो देखें [जब मुझे संकलन कॉम्पोनेंट्स कॉल करना है] (https://stackoverflow.com/q/43608398/2587435) –

+0

समझ गया। एक और सवाल: कोणीय सीएलआई उन परीक्षणों को उत्पन्न करता है जो 'पहले से() 'में' fixture.detectChanges() 'को कॉल करते हैं। क्या हर टेस्ट चलाने से पहले हमेशा इस फ़ंक्शन को आमंत्रित करना सबसे अच्छा अभ्यास है? अगर आपको लगता है कि यह असंबंधित है, तो मुझे इसके लिए एसओ पर एक अलग सवाल करने में खुशी होगी। – vincecampanale

8

जब आप अपने परीक्षण में एसिंक कॉल करते हैं तो वास्तविक परीक्षण फ़ंक्शन एसिंक कॉल पूरा होने से पहले पूरा हो जाता है। जब कॉल पूरा हो जाने पर आपको कुछ राज्य सत्यापित करने की आवश्यकता होती है (जो आम तौर पर मामला होता है) तो टेस्ट फ्रेमवर्क परीक्षण के रूप में पूरा होने की रिपोर्ट करेगा, जबकि अभी भी एसिंक काम चल रहा है।

async(...) का उपयोग करने के साथ आप परीक्षण ढांचे को तब तक प्रतीक्षा करने के लिए कहते हैं जब तक वापसी का वादा पूरा नहीं हो जाता है या परीक्षण पूरा होने से पहले देखा जा सकता है।

it('should show quote after getQuote promise (async)', async(() => { 
    fixture.detectChanges(); 

    fixture.whenStable().then(() => { // wait for async getQuote 
    fixture.detectChanges();  // update view with quote 
    expect(el.textContent).toBe(testQuote); 
    }); 
})); 

कोड then(...) के लिए पारित के बाद निष्पादित किया जाएगा परीक्षण समारोह में ही पूरा कर लिया। async() के साथ आप टेस्ट फ्रेमवर्क को जागरूक करते हैं, कि परीक्षण को पूरा करने से पहले इसे पूरा करने के लिए वादे और अवलोकन के लिए इंतजार करना होगा।

भी

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