2015-10-26 26 views
6

Açısal uygulamamı İletki ile test ediyorum. Kullanıcı benim uygulamamda oturum açtıktan sonra, bir saatte bir iş yapmak için $ timeout ayarlıyorum (böylece kullanıcı 13: 00'de oturum açtıysa, $ timeout saat 14: 00'da çalışacaktır). ...

https://github.com/angular/protractor/blob/master/docs/timeouts.md yüzden sayfa o tamamlamak için $ zaman aşımı bekliyor demektir tamamen yüklenene kadar Açıölçer bekler anlıyorum: Bu zaman aşımı sayfayı okudum

"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(){....." 

: Bunları arızaları almaya devam

İleticiyi bu $ zaman aşımını beklemeden nasıl yapabilirim? Kullanmak istemiyorum: o zaman benim testleri başka nedenlerle başarısız olur çünkü

browser.ignoreSynchronization = true; 

(diğer açısal bileşenleri hala yüklemek için zamana ihtiyacı ...)

+1

Test ettikten hemen sonra bu zaman aşımını yıkamadan silmeyi denediniz mi? – MBielski

cevap

3

çözüm olacaktır aktif temizlemek zaman aşımları (as @MBielski mentioned it in comments), ancak orijinal temizleme yönteminin kendisi sadece angalar-alaylarda kullanılabilir. Açısal-alayları doğrudan kullanmak için <script> etiketi olarak sayfaya eklemeniz gerekecek ve yarattığı tüm geçersiz kılmalarla uğraşmak zorunda kalacaksınız, bu da birçok yan etki üretiyor. Oluşturulan tüm zaman aşımlarını dinleyerek ve daha sonra talep üzerine yeniden düzenleyerek açısal-alay kullanmadan floş yeniden oluşturabiliyordum. Örneğin

, kendi Açısal Uygulamada bir zaman aşımı varsa:

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); 
}); 

O, bunu için çalışacak emin tür deneysel değilim oluyor:

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

testi gibi görünecek senin durumun. Bu kod ayrıca browser.addMockModule'u ayrı bir node.js modülüne taşıyarak basitleştirilebilir. Ayrıca, kısa zaman aşımlarını (100ms gibi) kaldırmak istiyorsanız, şu anda Açısal süreçleri çalıştırabilir, bu nedenle test kırılır, sorun olabilir.

+0

güzel bir çözüm. Ancak, doğru anlarsam, bu çözüm tüm zaman aşımlarını iptal eder, bu yüzden zaman aşımı devam ederken bir iddiayı test edemem. – BiAiB

+0

@BiAiB, Zaman aşımları sadece 'browser.executeScript (...)' kısmını çağırdığınızda iptal edilir, ilk önce iddiaları yapabileceğinizi ve sonra gerekirse zaman aşımlarını öldürebileceğinizi düşünüyorum. Belki de 'afterEach' içindeki browser.executeScript (...) parçasının yerleştirilmesi de işe yarayacaktır. –

0

Çözüm, zaman aşımına uğrayan ve zaman aşımına uğrayan http isteğini değiştirip, zaman aşımını bir süreliğine milisaniye (isteğiniz) o http isteğiyle değiştirecek ve böylece uzun süre çalışan http isteği kapalı olacak (yeni zaman aşımı nedeniyle).) ve sonra anında yanıtı test edebilirsiniz.

Bu iyi çalışıyor ve umut verici.

İlgili konular