2017-01-19 13 views
7

Metin girişinin metnini nasıl ayarlarsınız ve sonra React/Enzim ile değerini test edersiniz? solutions here çalışmamak görünen tümReaktivite ve Enzim ile metin ayarının sınanması

const input = wrapper.find('#my-input'); 

input.simulate('change', 
    { target: { value: 'abc' } } 
); 

const val = input.node.value; 

//val is '' 

..

+0

'mount' düzgün çalışması için. – sigod

cevap

8

gerçekten kodunuzda neler olduğunu anlamak için sizin bileşen kodunu (özellikle sizin onChange işleyicisi görmek faydalı olacaktır.

Ancak içinde Bu aslında sizindeğerini değiştirmeyecektir

input.simulate('change', {target: {value: 'abc'}}); 

: aşağıdaki kodu saygılarımla 10 eleman yerine, onChange işlevinizin çalışmasına ve {target: {value: 'abc'}} gibi görünen bir olay nesnesi sağlamasına neden olur.

Buradaki fikir, onChange işlevinizin durumunuzu veya deposunuzu güncelleştirmesidir, bu nedenle bu işlevi tetiklemeniz DOM'inizin güncellenmesine neden olur. Gerçekte input.simulate('change') kullanılarak tanımlanmış bir onChange işleyiciniz yoksa bir şey yapmayacaktır. Amacınız aslında bir onChange işleyicisi tetiklemek bir girişin değerini ayarlamak değil istiyorsa

Yani, o zaman en döngüsünü hale Tepki elle ancak bu engellemeyi edilir wrapper.find('#my-input').node.value = 'abc'; gibi bir şey kullanarak DOM güncellemek için JS kullanabilir ve büyük olasılıkla olacak Yeniden oluşturmayı tetiklemek için herhangi bir şey yaparsanız bu değeri temizlenir/kaldırılır.

+0

Değeri "input.node.value =" Test "ile ayarlamaya çalışıyorum ve bu hatayı alıyorum' TypeError: Özellik değeri eklenemiyor, nesne genişletilemiyor '. Herhangi bir fikir? – jhamm

+0

@jhamm Aşağıda cevabımı kontrol edin. – leandroico

5
Buraya React 16 ve Enzyme 3.10 kullanıyorum

ve bu tamamen (orada çok fazla farklı önerileri denedikten sonra) benim için çalıştı: Görünüşe göre, önceki sürümlerinde kullandığınız olabilir

wrapper.find("input").instance().value = "abc"; 

node veya getNode() yerine Daha önceki birçok denememin parçaları olan instance().

Bu, hem Enzim 3 ve Enzim 2 için çalışır
+0

'.node' kullandım ama Enzim bana getElement()' yi kullanmamı söyledi, fakat bu bana dom elementini değil tepki elemanını verdi. Instance() işlevini paylaşmak için Thx. – velop

3

:

wrapper.find('input').getDOMNode().value = 'new value'; 
wrapper.find('input').simulate('change'); 

.getDOMNode() Enzim içinde .instance() Enzim 2'de .node gibi kullanılabilir ve benzeri olabilir 3. Kullanmak gerektiğine işaret

İlgili konular