2015-03-05 27 views
7

İlgili bölümü bulmak için saatlerce kod okumak istemiyorum, ama yasemin saatini nasıl uygulayacağını merak ediyorum. Bununla ilgili ilginç olan şey, senkronizasyon test koduyla eşzamansız kodu test edebilmesidir. ES5'i destekleyen geçerli node.js ile AFAIK, bu mümkün değildir (asenkron işlevleri ES7'de tanımlanmıştır). Js kodunu östroverse gibi bir şeyle ayrıştırır ve senkronizasyondan bir uyumsuzluk testi yapar mı?Yasemin saati nasıl çalışır?

bahsediyorum ben ne Sadece bir örnek:

it("can test async code with sync testing code", function() { 
    jasmine.clock().install(); 

    var i = 0; 
    var asyncIncrease = function() { 
     setTimeout(function() { 
      ++i; 
     }, 1); 
    }; 

    expect(i).toBe(0); 
    asyncIncrease(); 
    expect(i).toBe(0); 
    jasmine.clock().tick(2); 
    expect(i).toBe(1); 

    jasmine.clock().uninstall(); 
}); 

Buraya expect(i).toBe(1); bir geri dönüşünde yer olmalıdır.

cevap

10

install() işlevi, aslında setTimeout'un yerine, jasmine'ın daha fazla denetim sağladığını anlatan bir işlevle değiştirir. Bu onu senkronize eder, çünkü gerçek bir bekleme yapılmaz. Bunun yerine, aynı zamanda, senkronize olan tick() işleviyle manuel olarak taşırsınız.

kaynak kodunu bakınız: https://github.com/jasmine/jasmine/blob/ce9600a3f63f68fb75447eb10d62fe07da83d04d/src/core/Clock.js#L21

dahili olarak 5 saatlik bir zaman aşımı ayarlamak bir işlevi olduğunu varsayalım. Jasmine sadecearamasının yerini alır, böylece tick() numaralı telefonu aradığınızda geri arama çağrılır, böylece dahili sayaç 5 saat işaretine ulaşır veya geçer. Bu oldukça basit!

+0

Bu, gerçek zaman uyumsuz kodla çalışmaz, ör. db bağlantısıyla mı? – inf3rno

+2

@ inf3rno ajax şeyleri için ajax çağrısına (sunucunun çalıştığını varsayalım) veya entegrasyon testlerine uymak isteyebilirsiniz, aslında async olsun. – m59

+0

Tamam. ES5 için bir uyumsuzluk çerçevesi üzerinde çalışıyorum, bu yüzden sordum. Teşekkürler! :-) – inf3rno