2014-12-18 22 views
10

Bu yüzden, belgede bir tıklama olayı ekleyen kod için bazı testler yazıyorum. JSDom, ReactJS ve Mocha/Chai kurulumunu kullanıyorum. Aşağıdaki kodu bir sınamada denedim, ancak bu kod beklediğim yankıyı oluşturmaz, ancak bu kod bir testte şu kodu denedim: Simülasyona tıklayın Simülasyona tıklayın ReactJS/JSDom

JSDom ve ReactJS ile belgedeki tıklatmayı, anahtarlamayı vb. Taklit etmenin bir yolu var mı?

document.body.addEventListener('click', function() { 
    console.log('test'); 
}); 

document.body.click(); 

ve ben konsol günlüğü çıktısını alamadım ayırana dek: Nick cevapları için

GÜNCELLEME

, ben test etmek için bu kodu ekleyerek çalıştılar. JSDom ile ilgili bir sorun olup olmadığından ve bu tür bir şey yapıp yapmadığından emin değilim.

Bu kodu sınamaya ayarlayamazsam, sorun değil, şu anda sınama yapamayacağım bir kod zaten var (kod, genişlik, yükseklik vb. Elde edebilmek için gerçek bir DOM gerektirir). .) Ancak kodun çoğunu test edebilmek istiyorum (ve birim testi için PhantomJS kullanmak istemiyorum). Entegrasyon testlerim o kod tipini kapsayacaktır.

Update2

Unutulmaması gereken başka bir şey ben console.log(document); ben nesne yüzden olay ekli ediliyor biliyoruz click için _listeners özelliğine bağlı görünce, sadece olmak görünmüyor olmasıdır yürütülmesi.

+0

Eğer gerçek bir tarayıcıda aynı şeyi denedin mi? İşe yaradı mı? – Louis

+0

Evet, tarayıcıdaki kod düzgün çalışıyor – ryanzec

cevap

20

Güncelleme:document.body.click bir tarayıcıda çalışacaktır ancak jsdom için manuel etkinlik oluşturmak gerekir:

document.body.addEventListener('click', function() { 
    console.log('test'); 
}); 

var evt = document.createEvent("HTMLEvents"); 
evt.initEvent("click", false, true); 
document.body.dispatchEvent(evt) 

Yukarıdaki kod Jest benim için çalışıyor ve "yalnız" jsdom ile çalışmalıdır de.

+0

JSDom ile çalışmıyor gibi görünüyor, bununla ilgili bir güncelleştirme ekledi. – ryanzec

+0

@ryanzec kesinlikle haklısınız. Çalışması gereken, karışık bir şekilde de olsa güncelledim. –

+0

Teşekkürler, bu tıklama için çalışır, ancak olay verilerini ayarlamanız gereken olaylarla ilgili (keyupdate için bir keyup olayı ayarı gibi) ne olur? hazır, CustomEvent veya createEventObject kullanmak istiyorum gibi görünüyor, ancak her iki yöntem de JSDom – ryanzec

6

React.addons.TestUtils.Simulate yalnızca sanal olaylarla çalışır. Yerel etkinlikleri göndermek istiyorsanız, bunu doğrudan DOM api ile yapabilirsiniz.

bir tıklama simüle zaman, bu işler bir bileşeni varsa:

<div> 
    <button onClick={alert}>click me</button> 
</div> 

Ve 'buttonEl' adlı bir değişkende <button/> bir başvuru var ve bu çalıştırın:

React.addons.TestUtils.Simulate.click(buttonEl, 'hello world'); 

İçinde 'merhaba dünya' ile bir uyarı alırsınız. Tüm sınama araçları, sanal olayı oluşturur ve sanal dom ağacını kabarcıklar, olay işleyicileri yol boyunca çağırır.

+0

küme küme uyumsuzluğu kasti mi? 'onClick = {alert)' – nelsonic

+0

Hayır, teşekkürler :-) ama bu cevap zaten güncel değil – FakeRainBrigand

0

Basitçe bir Event oluşturmak ve sevk:

// Add an event listeners to the document 
document.addEventListener('click', function() { 
    console.log('test'); 
}); 

// Create a new `click` event and `dispatch` it 
var event = new MouseEvent('click') 
document.dispatchEvent(event) 
+1

'ReferenceError: MouseEvent tanımlı değil '... JSDOM eşdeğeri nedir? – nelsonic

+0

Sınıfın nereden ithal edildiğine katılıyorum? –

+0

@PabloJomer bu kurulum dosyasına bir göz atın: https://github.com/rbartoli/threesixty/blob/master/test/setup.js –