2011-09-06 21 views
13

Sayfa yüklendikten 5 saniye sonra başlayan 1 saniyelik jQuery .animate eylemim var. Yasemin birimi test kodumda bir Sinon zamanlayıcı ayarladıktan sonra animasyon sonrası özelliklerinin olması gerektiği gibi olup olmadığını görmek için 7 saniye sonra test ediyorum.Bir Jasmine birim testinde Sinon kullanarak jQuery animasyonunu nasıl taklit edebilirim?

Doğru çalışmıyor, bu yüzden neler olup bittiğini daha iyi görebilmek için Jasmine HTML test sayfamın bir animasyon örneğini yerleştirdim. Firefox ve Chrome, sayfa yüklenirken ise

  • , animasyon fonksiyon birim test hemen başarısız olur denir, sonra (aynı zamanda hemen) animasyon gözle görülür oluşur.

  • IE'de Opera ve Safari'de, sayfa yüklenir, animasyon işlevi çağrılır, birim testi hemen başarısız olur ve animasyon asla görünür olmaz. Ben umut Ne

(tüm tarayıcılarda) Aşağıdaki oldu:

  • sayfa yüklendiğinde, animasyon işlevi denir, animasyon anında tamamlar ve birim test hemen başarılı olur.

Sinon's documentation baktığımızda, sahte zamanlayıcılar aşağıdaki süreçleri kapsayacak var: setTimeout, clearTimeout, setInterval, clearInterval, Date

nasıl jQuery'nin animasyon çalışmalarını bilmiyorum ama bunun için CSS kullanarak hayal geçiş ve CSS geçişleri Sinon'un useFakeTimers kapsamında yer almıyor, bu yüzden problem olduğunu düşünüyorum. Ancak, sorun hakkında haklıysam hala bir çözüme ihtiyacım var.

Belki Sinon'dan başka bir şey denemeliyim? Jasmine'in waits() bu testte mükemmel bir şekilde çalışıyor, ama kendim gibi sabırsız insanlar için inanılmaz derecede pratik değildir.

Başka önerileriniz var mı? Lütfen JS birim testinde yeniyim, bu yüzden belirsiz cevaplar bana yardım etmekten daha fazla kafa karıştırır. o)

+0

Bu birkaç gün geçti ve kimse cevap gelmiştir. Bunu yapmak için şu anda ne yapıyorum, Jasmine'in waits() işlevi kullanıyor. Testler anlık olmamakla birlikte gerçek zamanlı olarak tamamlanmasına rağmen iyi çalıştı. Shucks. Lütfen benim için sahip olabileceğiniz başka fikirler yayınlayın. Teşekkürler. – gcdev

+0

hey! Bu soruna yeni bir çözüm buldunuz mu? $ .fx.off cevap mükemmel çalışıyor, ama hala olması gereken yol değil ... –

+0

Ben yapmadım. Waits() kullanıyorum. Bu soruyu bütünüyle unutmuştum. Ama Derek'in çözümünün Alex'inkinden daha basit olduğunu görmek ve lehine birkaç oyu var (bu yüzden muhtemelen başkaları için işe yarıyor), bunu deneyeceğim ve eğer benim için işe yararsa cevap olarak işaretleyeceğim. – gcdev

cevap

18

:

jQuery.fx.off = true 

Bu yangın Etkinlik için açmasının 7 ikinci bekleme sorununuzu çözmez ama DOM sahip olduğunu test edebilirsiniz demek beklediğiniz gibi değiştirildi.

+0

teşekkürler. iyi çalışıyor ve (ne yazık ki?) sinon.useFakeTimers gereksiz yapar ... –

4

Aynı problem yaşadım. Bunun olacağına inanıyorum çünkü jQuery'nin animasyonu, setTimeout() belgesine güveniyorsa, requestAnimationFrame()'dan yararlanır. Ben null window nesne üzerinde tüm tarayıcıya özel requestAnimationFrame fonksiyonları ayarlayarak bu soruna çalıştık

:

window.webkitRequestAnimationFrame = null; 
window.mozRequestAnimationFrame = null; 
window.oRequestAnimationFrame = null; 

bu kod jQuery yüklenir önce yürütür emin olun.

jQuery efektleri kapatmak için jQuery off kullanabilirsiniz
+0

jasmine + jquery + sinon.js kullanırken bu benim için çalışmadı. Hatta benim spec dosyalarından ve hatta jquery'den önce bir src bağımlılığı olarak yüklendiğinden emin oldum. Belki yanlış bir şey mi yaptım? Tuhaf olan şey, testi tek başıma yürüttüğümde (başkaları olmadan), geçer. – thekingoftruth

1

Buranın gösterdi gibi SinonJs ile mümkün olduğunu düşünüyorum: http://sinonjs.org/qunit

test("should animate element over 500ms", function() { 
    var el = jQuery("<div></div>"); 
    el.appendTo(document.body); 

    el.animate({ height: "200px", width: "200px" }); 
    this.clock.tick(510); 

    equals("200px", el.css("height")); 
    equals("200px", el.css("width")); 
});