2017-12-14 213 views
9

Biz oldukça büyük bir test kod tabanına sahiptir ve bazı durumlarda (javascript kodu yaklaşık 10000 satır), biz Protractor-to-Açısal senkronizasyon kapatmanız gerekir Zaman Senkronizasyonu tekrar açmayı umuyoruz sonraki tüm testlerin hata ayıklamak için zaman ve çaba gerektiren belirsiz nedenlerle başarısız olmasına neden oluyor.İletkiyi Açısal senkronizasyona tekrar açmak nasıl unutulmamalıdır? Sorun zaman için vardır,</p> <pre><code>browser.ignoreSynchronization = true; </code></pre> <p>Ama:

Senkronizasyonun bir sınamada açık olduğundan emin olmanın bir yolu var mı?

ESLint'a göre statik kod analizimiz var ve kod incelemeleri gerçekleştiriyoruz.

+1

Belki de bir sarmalayıcı işlevi yazabilirsiniz. 'inSync (() => {...})' başlangıçta ve sonunda tekrar kapatır - bu daha sonra tüm beklenti geri çağrılarını veya sadece parçalarını sarabilir. Ardından, özniteliği yalnızca bu tek işlevde ayarlayabilirsiniz. – jonrsharpe

+0

@jonrsharpe hm, "içerik yöneticisi" gibi hoş bir fikir, hoşuma gitti. Bazen bir kaç tane için bunu yapmamız gerekse de() 's. – alecxe

+0

Bunun yerine webdriverio'yu kullanın. O zaman endişelenmene gerek yok. Tüm ciddiyette, bu, ileticiden wdio'ya geçmenin tam nedeni. Çerçeveniz büyüdükçe, senkronizasyon açıldığında ya da devam etmediğinde izlenmesi gereken bir kâbus olur. Deneyimlerime göre, göç ettiğimde aslında daha az kodla sonuçlandım. – tehbeardedone

cevap

9

Sadece afterTest kanca yapmak (test koşucu bağlıdır) gibi denir herhangi bir noktada test veya herhangi bir nedenle çöktü test - sonraki testler etkilenmez:

Jasmine için kodum. Açıölçer yapılandırma:

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

gerçek kodunda ben bu böyle resetBrowser falan denilen fonksiyonun içine kaydırmak istiyorum. Ayrıca ondan söz verebilir ve sonra bu sözünü geri çağırabilir - böylece yeni test, söz verilinceye kadar başlayamaz.

+1

Güzel, global 'AfterEach' muhtemelen şu ana kadarki en iyi fikir. Teşekkürler, Хотабыч! – alecxe

4

Aynı senaryo ile uğraşırken bir noktada yardımcı bir işlev oluşturdum ve yeni bir sayfaya gitmeden önce onu çağırdım. İşlevi çağırmak için hala “hatırla” seçeneğiniz vardır, ancak en azından bu, bu değişikliğin üstesinden geldiğiniz kodda yalnızca bir yer verir.

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

Ve hatta geçiş unuttum eğer öyleyse benim kodda, ben onun başlangıç ​​durumuna geri tüm ayarlamaları utils.isAngularSite(false);