2015-07-13 6 views
5

Son olarak bir meslektaşım ve Çıraklık adım tanımlarını "Yapımcı" ve "Chai" olarak Promise kullanarak uygulamak için "doğru" şekilde bazı anlaşmazlıklar yaşadım. Bizim çekişmemiz, kesin olarak, Hıyarlar bağlamında vaat edilen bir çözümün gidişatının karşılıklı olarak anlaşılmamasıdır.Promise olarak Chai'yi kullanarak Prosesçi ve Salatada vaat etme vaatlerini çözme

AngularJS uygulamasına karşı test ediyoruz, dolayısıyla söz ve zaman uyumsuz davranışı çözümlemek gerekli bir kötülük. Sahip olduğumuz en büyük sorun, senkronize test davranışını zorlamak ve Salatalık’ın adım tanımları arasında vaatler vermesini sağlamaktır. Bazı durumlarda, Çizelgecin Webdriver'ın bunları yürütmeden önce adım tanımları boyunca düz bir şekilde sürtüşmesi gibi durumları gözlemledik. Bu sorunun Çözümlerimiz

varsayımsal senaryoyu düşünün ... değişebilir: karışıklık çoğu
Scenario: When a user logs in, they should see search form 
    Given a user exists in the system 
    When the user logs into the application 
    Then the search form should be displayed 

Sonra adımda kaynaklanır. Bu örnekte, tanım, arama formuna ait tüm alanların sayfada birden fazla isPresent() denetimi anlamına geldiğini ileri sürmelidir. dokümantasyon ve ben bulabildim örneklerden

, ben iddia bu gibi görünmelidir hissetti:

this.Then(/the search form should be displayed/, function(next) { 
    expect(element(by.model('searchTerms')).isPresent()).to.eventually.be.true; 
    expect(element(by.model('optionsBox')).isPresent()).to.eventually.be.true; 
    expect(element(by.button('Run Search')).isPresent()).to.eventually.be.true.and.notify(next); 
}); 

Fakat arkadaşım söz çözünürlüğü karşılamak için, size zincire gerek iddia senin böyle() daha sonra bekler:

this.Then(/the search form should be displayed/, function(next) { 
    element(by.model('searchTerms')).isPresent().then(function(result) { 
     expect(result).to.be.true; 

    }).then(function() { 
     element(by.model('optionsBox')).isPresent().then(function(result) { 
      expect(result).to.be.true; 

     }).then(function() { 
      element(by.button('Run Search')).isPresent().then(function(result) { 
       expect(result).to.be.true; 
       next; 
      }); 
     }); 
    }); 
}); 

ikincisi benim için gerçekten yanlış geliyor, ama eski ya doğru olup olmadığını gerçekten bilmiyorum. Sonunda anladığım şekilde(), o zaman() 'e benzer şekilde çalışır, çünkü devam etmeden önce çözme vaadini bekler. Önceki örneğin her bekleyiş() çağrısını beklemek için beklemesini beklerim ve sonraki adımda ilerlemek için salatalık işaretini bildirmek için son beklemede() notify() öğesini kullanarak sonraki() öğesini çağırır.

daha karışıklığa eklemek için Gözlemlediğim diğer meslektaşları bu gibi onların beklediği yazın:

expect(some_element).to.eventually.be.true.then(function() { 
    expect(some_other_element).to.eventually.be.true.then(function() { 
     expect(third_element).to.eventually.be.true.then(function() { 
      next(); 
     }); 
    }); 
}); 

Yani sorulan Ben ima düşünüyorum şunlardır:

  • mı uygulanıyor Yukarıdaki kite değil mi?
  • Sonunda() gerçekten ne yapar? O zaman() gibi eşzamanlı davranışı zorlar mı?
  • (ve şimdi) neyi gerçekten yapar? Bir sonraki() içindeki next() öğesini çağırmaktan farklı mıdır?
  • Henüz bulamadığımız daha iyi bir uygulama kılavuzu var mı?

Şimdiden çok teşekkürler.

cevap

4
  • Duygularınız doğruydu, meslektaşınız yanlıştı (makul bir hata olsa da!). İletki, bir saniye çalıştırmadan önce otomatik olarak bir WebDriver komutunu bekler. Yani ikinci kod bloğunuzda element(by.button('Run Search')).isPresent() hem element(by.model('optionsBox')).isPresent() hem de element(by.model('searchTerms')).isPresent() bitene kadar çözülmez.
  • eventually vaatleri çözer.Bir açıklama geldi: https://stackoverflow.com/a/30790425/1432449
  • Ben bir en iyi uygulamalar rehberi olduğunu inanmıyorum
  • then()next() koyarak farklıdır inanmıyorum. Salatalık, İletki ekibinin temel odak noktası değildir ve bunun için destek, topluluk tarafından büyük ölçüde github üzerinde sağlanır. Siz ya da tanıdığınız biri en iyi uygulama rehberi yazmak istiyorsanız, biz (protraktör ekibi) bir PR'yi memnuniyetle karşılarız!
+0

Her yerde kullanıldığında oldukça temiz görünüyor ve harika görünüyor! Katılıyorum, örneklere ve açıklamalara dayanarak, yukarıdaki örnekte zincirleme yapmak çok mantıklı görünmektedir. İletici'de test etmek için biraz yeniyiz, bu yüzden bizim için tüm yeni bölge. Belki de gelecekte en iyi uygulamalar rehberi yazmayı düşüneceğiz. :) –

0

Benim için ne işe yarıyor bu - Aşağıdaki işlev, her zaman eşit olacak bir şey arar - bir html etiketinin varlığı durumunda.

this.Given(/^I go on "([^"]*)"$/, function (arg1, callback) { 
    browser.get('/' + arg1); 
    callbackWhenDone(callback); 
}); 

bildiğim bir hack Biraz ama iş alır: Ben Bu basit bir test kullanımıdır

function callbackWhenDone(callback) { 
    browser.wait(EC.presenceOf(element(by.css('html')))) 
     .then(function() {callback();}) 
} 

geri aramasında geçen her testin sonunda bu işlevi çağırmak