2015-10-26 22 views
6

मैं प्रोटैक्टर के साथ अपने कोणीय अनुप्रयोग का परीक्षण कर रहा हूं। एक बार जब उपयोगकर्ता मेरे ऐप में लॉग इन हो जाता है, तो मैंने एक घंटे में कुछ नौकरी करने के लिए $ टाइमआउट सेट किया है (इसलिए यदि उपयोगकर्ता 13:00 बजे लॉग-इन था, तो $ टाइमआउट 14:00 बजे चलाएगा)।

"Timed out waiting for Protractor to synchronize with the page after 20 seconds. Please see https://github.com/angular/protractor/blob/master/docs/faq.md. The following tasks were pending: - $timeout: function onTimeoutDone(){....." 

मैं इस समय समाप्ति पेज पढ़ा है: मैं इन विफलताओं बार आ रही है https://github.com/angular/protractor/blob/master/docs/timeouts.md इसलिए मैं समझता हूँ कोणमापक इंतजार कर रहा है जब तक पेज को पूरा भरा वह पूरा करने के लिए $ टाइमआउट के लिए इंतजार कर रहा है जिसका मतलब है कि है ...

मैं प्रोट्रैक्टर को उस $ टाइमआउट के लिए कैसे इंतजार नहीं कर सकता? हो जाएगा सक्रिय फ्लश करने के लिए

browser.ignoreSynchronization = true; 

क्योंकि फिर मेरे परीक्षण अन्य कारणों के लिए असफल हो जायेगी (अन्य कोणीय घटक अभी भी समय लोड करने के लिए की जरूरत है ...)

+1

क्या आपने इसे सेट करने के तुरंत बाद अपने परीक्षण के माध्यम से उस टाइमआउट को फ़्लश करने का प्रयास किया है? – MBielski

उत्तर

3

समाधान: मैं नहीं चाहता कि उपयोग करना चाहते हैं टाइमआउट (as @MBielski mentioned it in comments), लेकिन मूल फ्लश विधि स्वयं केवल एंग्लर-मैक्स में उपलब्ध है। सीधे कोणीय-मोक्स का उपयोग करने के लिए आपको इसे पृष्ठ पर <script> टैग के रूप में शामिल करना होगा और आपको इसे बनाने वाले सभी ओवरराइड से निपटना होगा, इससे कई दुष्प्रभाव पैदा होते हैं। मैं किसी भी टाइमआउट को सुनकर और फिर मांग पर रीसेट करके कोणीय-मोक्स का उपयोग किये बिना फ्लश को फिर से बनाने में सक्षम था।

उदाहरण के लिए, यदि आप अपने कोणीय अनुप्रयोग में समय समाप्त हो, तो:

it('should reset timeouts', function() { 

    browser.addMockModule('e2eFlushTimeouts', function() { 

     angular 
     .module('e2eFlushTimeouts', []) 
     .run(function ($browser) { 

      // store all created timeouts 
      var timeouts = []; 

      // listen to all timeouts created by overriding 
      // a method responsible for that 
      var originalDefer = $browser.defer; 

      $browser.defer = function (fn, delay) { 
       // originally it returns timeout id 
       var timeoutId = originalDefer.apply($browser, arguments); 
       // store it to be able to remove it later 
       timeouts.push({ id: timeoutId, delay: delay }); 
       // preserve original behavior 
       return timeoutId; 
      }; 

      // compatibility with original method 
      $browser.defer.cancel = originalDefer.cancel; 

      // create a global method to flush timeouts greater than @delay 
      // call it using browser.executeScript() 
      window.e2eFlushTimeouts = function (delay) { 
       timeouts.forEach(function (timeout) { 
        if (timeout.delay >= delay) { 
         $browser.defer.cancel(timeout.id); 
        } 
       }); 
      }; 

     }); 

    }); 


    browser.get('example.com'); 

    // do test stuff 

    browser.executeScript(function() { 
     // flush everything that has a delay more that 6 sec 
     window.e2eFlushTimeouts(6000); 
    }); 

    expect(something).toBe(true); 
}); 

यह थोड़े प्रयोगात्मक, मैं नहीं यकीन है कि अगर इसके लिए काम करेंगे है:

$timeout(function() { 
    alert('Hello World'); 
}, 10000); // say hello in 10 sec 

परीक्षण की तरह दिखाई देगा आपका मुकदमा। इस कोड को browser.addMockModule को एक अलग node.js मॉड्यूल पर ले जाकर सरलीकृत किया जा सकता है। यदि आप शॉर्ट टाइमआउट (जैसे 100 एमएमएस) को हटाना चाहते हैं तो भी समस्याएं हो सकती हैं, यह वर्तमान में कोणीय प्रक्रियाओं को चालू कर सकती है, इसलिए परीक्षण टूट जाएगा।

+0

अच्छा समाधान। हालांकि, अगर मैं सही ढंग से समझता हूं, तो यह समाधान सभी टाइमआउट को रद्द कर देता है, इसलिए टाइमआउट चल रहा है, इसलिए मैं एक दावा का परीक्षण नहीं कर सकता। – BiAiB

+0

@BiAiB, जब आप 'browser.executeScript (...) 'भाग कहते हैं, तो टाइमआउट केवल तभी रद्द हो जाते हैं, मेरा मानना ​​है कि आप पहले दावा कर सकते हैं और फिर आवश्यक होने पर टाइमआउट को मार सकते हैं। हो सकता है कि 'afterEach' में 'browser.executeScript (...)' भाग भी काम करेगा। –

0

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

यह अच्छी तरह से काम कर रहा है और आशाजनक है।

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