2017-12-14 92 views
9

हम एक नहीं बल्कि विशाल परीक्षण codebase है और कुछ स्थितियों में (जावास्क्रिप्ट कोड 10000 के बारे में लाइनों), हम कोणमापक करने वाली कोणीय तुल्यकालन बंद करने के लिए की जरूरत है:प्रोटैक्टर को फिर से कोणीय सिंक में बदलने के लिए कैसे भूलना नहीं है?

browser.ignoreSynchronization = true; 

लेकिन, समस्या-समय पर करने के लिए, है समय हम फिर से पर सिंक्रनाइज़ेशन को चालू करना भूल जाते हैं जिससे सभी बाद के परीक्षण अस्पष्ट कारणों से असफल हो जाते हैं जिनके लिए डीबग करने के लिए समय और प्रयास की आवश्यकता होती है।

क्या यह सुनिश्चित करने का कोई तरीका है कि परीक्षण में सिंक्रनाइज़ेशन वापस चालू हो जाए?

हमारे पास ESLint पर आधारित स्थिर कोड विश्लेषण है और कोड समीक्षाएं करें।

+1

शायद एक रैपर फ़ंक्शन लिखें उदा। 'बिना Sync (() => {...})' जो इसे अंत में शुरू होता है और अंत में वापस चला जाता है - फिर यह पूरी उम्मीद कॉलबैक या केवल उनमें से कुछ हिस्सों को लपेट सकता है। फिर आप केवल उसी फ़ंक्शन में विशेषता सेट करते हैं। – jonrsharpe

+0

@jonrsharpe एचएम, एक "संदर्भ प्रबंधक" की तरह, अच्छा विचार, मुझे यह पसंद है। कभी-कभी हमें कई पंक्तियों (ओं) के लिए इसे एक पंक्ति में रखना होगा .. धन्यवाद। – alecxe

+0

इसके बजाए वेबड्राइवरियो का उपयोग करें। तो आपको इसके बारे में चिंता करने की ज़रूरत नहीं है। सभी गंभीरता में, यह सटीक कारण है जिसे मैंने प्रोटैक्टर से wdio में स्विच किया था। एक बार आपका ढांचा बड़ा हो जाने पर यह सिंक चालू होने पर या नहीं होने पर ट्रैक रखने के लिए एक दुःस्वप्न बन जाता है। मेरे अनुभव में, जब मैं माइग्रेट किया गया तो मैं वास्तव में कम कोड के साथ समाप्त हुआ। – tehbeardedone

उत्तर

9

मैं सिर्फ afterTest हुक कर (अपने परीक्षण धावक पर निर्भर करता है), जहां मैं सब कुछ वापस सेट अपने मूल्य उस राज्य के लिए की तरह कहा जाता है, यदि ऐसा है तो मैं भी स्विच करने के लिए भूल गया परीक्षण में वापस, या किसी भी बिंदु पर किसी कारण से क्रैश हो गया - अगले परीक्षण प्रभावित नहीं होंगे:

जैस्मीन के लिए मेरा कोड। चांदा config:

onPrepare() { 
    ... 
    afterEach(function() { 
    // Setting ignoreSychronization back to true, in case it was changed in tests 
    browser.waitForAngularEnabled(true); 
    // Setting back to default frame. In case test was working in iframe 
    browser.switchTo().defaultContent(); 

    // This depends on your architecture. We do clean run for each test. 
    browser.manage().deleteAllCookies(); 
    browser.executeScript('window.sessionStorage.clear(); window.localStorage.clear();').then(
     undefined, 
     function (err) { 
      // Errors will be thrown when browser is on default data URL. 
      // Session and Local storage is disabled for data URLs 
      // This callback is needed to not crash test, and just ignore error. 
     }); 

    browser.manage().timeouts().implicitlyWait(5000); // I even rewrite implicit wait back to default value, in case i touched it in tests 

    // Also you might want to clear indexdb storage after tests. 
    }) 

वास्तविक कोड में मैं इस resetBrowser या कुछ इस तरह कहा जाता समारोह में लपेट जाएगा। इसके अलावा आप इससे वादा वापस कर सकते हैं, और फिर उस वादे को हुक से वापस कर सकते हैं - इसलिए नया परीक्षण शुरू नहीं होगा जब तक कि संकल्प हल नहीं हो जाता

+1

ओह अच्छा, एक वैश्विक 'बाद में' शायद अब तक का सबसे अच्छा विचार है। धन्यवाद, Хотабыч! – alecxe

4

एक बिंदु पर जब मैं इसी परिदृश्य से संघर्ष कर रहा था तो मैंने एक सहायक कार्य बनाया और इसे एक नए पृष्ठ पर नेविगेट करने से पहले इसे बुलाया। आपको अभी भी फ़ंक्शन को कॉल करने के लिए "याद रखना" है, लेकिन कम से कम यह आपको उस कोड में केवल एक स्थान देता है जहां आप उस परिवर्तन को संभालने वाले हैं।

isAngularSite(flag) { 
    browser.ignoreSynchronization = !flag; 
} 

और मेरे कोड में मैं इसे utils.isAngularSite(false);

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