कोणीय 2 परीक्षण - जब उपयोग करने के लिए Async फ़ंक्शन कॉल -


86

जब आप Angular 2 में परीक्षण करते हैं तो आप TestBed में Async फ़ंक्शन का उपयोग करते हैं ?

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

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

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

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

क्या कोई मुझे इस पर प्रकाश डाल सकता है?

जवाबों:


95

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

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

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

यहां, यह मूल जैस्मीन है, जहां हम जैस्मीन को बताते हैं कि इस परीक्षण को पूरा होने में देरी होनी चाहिए 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(यदि आप वेबपैक का उपयोग नहीं कर रहे हैं), तो कोणीय को टेम्पलेट प्राप्त करने के लिए XHR अनुरोध करने की आवश्यकता होती है, इसलिए घटक का संकलन अतुल्यकालिक होगा। इसलिए हमें परीक्षण जारी रखने से पहले हल करने तक इंतजार करना चाहिए।


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

2
@vincecampanale टेम्पलेटउल पहले ही विन्यास में विन्यास के दौरान मायने रखता है। जिस स्थिति में आपको कॉल करने की आवश्यकता है compileComponentsasyncयदि आप पूछ रहे हैं कि इसका प्रत्येक परीक्षण पर उपयोग करने से कोई लेना-देना नहीं है । जहां तक ​​सुरक्षित होने के नाते (जब आपको कॉल करना चाहिए compileComponents), देखें कि मैं कब संकलन करने वाला हूं। साथी
पॉल समसोथा

2
@vincecampanale यह हमेशा ऐसा मामला नहीं है जिसे आप चाहते हैं कि इसे परीक्षण से पहले बुलाया जाए । कभी-कभी कुछ इनिशियलाइज़ेशन करने के बाद आप इसे कॉल करना चाह सकते हैं। आपको यह समझने की ज़रूरत है कि वास्तव में क्या कॉल करना है। हालांकि अधिकांश समय यह ठीक होना चाहिए। लेकिन मुझे व्यक्तिगत रूप से पसंद नहीं है कि उन्होंने यह निर्णय लेने के लिए खुद पर लिया। लेकिन मुझे लगता है कि बहुत से लोग इस समस्या में भाग लेते हैं, जहां वे इसे कॉल करना भूल जाते हैं, और उन्हें आश्चर्य होता है कि क्यों काम नहीं कर रहे हैं। तो शायद यह बेहतर है कि वे कॉल उत्पन्न करें। स्थान विवादास्पद हो सकता है, लेकिन कम से कम वे इसे कहते हैं
पॉल सैमसोथा

2
@vincecampanale आम तौर पर जब आप दृश्य (पुनः) प्रदान करना चाहते हैं, जब आपको इसे कॉल करना चाहिए। उदाहरण के लिए घटक बनाएँ -> दृश्य प्रस्तुत करें। लेकिन अगर आप पहले कुछ बनाना चाहते हैं जैसे क्रिएट कंपोनेंट -> कंपोनेंट में चेंज वैल्यू जिसे रेंडर करने के लिए इस्तेमाल किया जाता है -> रेंडर व्यू। यही मेरा मतलब है कि शायद आप पहले कुछ करना चाहते हैं
पॉल समसोथा

1
अरे, और एक बात। पहली बार जब आप इसे कॉल करते हैं, तब ngOnInitघटक में कहा जाता है। कभी-कभी परीक्षण करते समय यह बात मायने रखती है
पॉल समसोथा

26

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

उपयोग करने के साथ 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()

यह सभी देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.