2014-10-20 16 views
12

JS TestUtils tepki:Testi Jest bir form ve 3 radyo düğmeleri aşağıdaki (sahte isim) gibi olan bir form var

<form className="myForm" onSubmit={this.done}> 
    <input className="myRadio" checked={ŧrue} type="radio" name="myRadio" onChange={this.change} value="value1" 
    <input className="myRadio" type="radio" name="myRadio" onChange={this.change} value="value2" 
    <input className="myRadio" type="radio" name="myRadio" onChange={this.change} value="value3" 
<input type="submit" className="submit" /> 
</form> 

Ve Değiştiğinde ve onSubmit etkinliklerini test etmek için çalışırken çok zorlanıyorum .

inputs = TestUtils.scryRenderedDOMComponentsWithClass(MyComponentRendered, 'myRadio'); 
myForm = TestUtils.findRenderedDOMComponentWithClass(MyComponentRendered, 'myForm'); 

Ben böyle bir test var: çağrılmalıdır fonksiyonu (MyComponent.change) dışında çalışan

it("changes the checked state when clicked", function() { 
    MyComponent.change = jest.genMockFunction(); 

    expect(inputs[0].getDOMNode().checked).toBe(true); 
    TestUtils.Simulate.change(inputs[1], {target: {value: 'value2'}}); 
    expect(inputs[0].getDOMNode().checked).toBe(false); 
    expect(inputs[1].getDOMNode().checked).toBe(true); 
    expect(inputs[2].getDOMNode().checked).toBe(false); 

    expect(MyComponent.change).toBeCalled(); //Fails 
    expect(MyComponent.change.mock.calls.length).toBe(1); //Fails too 
}); 

ama değil.

Ben de onSubmit için bir test var:

it("saves on submit", function() 
    MyComponent.done = jest.genMockFunction(); 
    MyComponent.insideDone = jest.genMockFunction(); 
    TestUtils.Simulate.submit(myForm); 
    expect(MyComponent.done).toBeCalled(); //Fails 
    expect(MyComponent.insideDone).toBeCalled(); //Success 
}); 

Uyarı: MyComponent.insideDone 'done' işlevi tarafından çağrılan bir işlevdir.

Bu da başarısız. Buradaki problemin, olayları doğru bir şekilde simüle etmemem olduğuna eminim. Ancak, React'tan Jest ve TestUtils kullanarak bunun bir örneğini bulamadım.

+0

Tıklatma olayını kullanarak bir form göndermeyi denedim, ancak hiçbir yerde sona ermedim, ancak form öğesinin kendisinin ele geçirilmesine yardımcı olan ve TestUtils.Simulate.submit (form) – nimgrg

+0

çağırılıyordu. Değişiklik işlevine gelince, muhtemelen MyComponent öğesini kontrol edecektim. mock işlevinin çağrıldığını kontrol etmek için change.mock.calls.length 1'e eşittir. – nimgrg

+0

@nimgrg, bu mock.calls.length da başarısız oluyor. Cevabımı güncelledim. Son örnekte olduğu gibi, "bitti" işlevi başka bir işlevi çağırıyor ... ve o da çağrıldığı bildirildi. –

cevap

2

Sorun, özgün işlevi zaten Reaktive verdikten sonra işlevi değiştirdiğinizden kaynaklanıyor. onSubmit={this.done} ifadesi bu işlevdir ve bu olay işleyicisi olarak ayarlanır. Render işlevi tamamlandıktan sonra, instance.done'u değiştirirsiniz, ancak React eski işlevi zaten aldı. Ne yapmalıyım yerine geçerli: Bu olay işleyicisi her zaman örnek (değiştirdiğiniz bir) üzerinde yöntemini çağırır emin olur

<form className="myForm" onSubmit={() => this.done()}>

. Bu, React ile geleceğin uyumlu olmasının güzel yan etkisine sahiptir, çünkü örneklere tüm yöntemleri otomatik olarak vermeyi durduracaklardır.

+0

Mükemmel cevap! Yapmam gereken tek değişiklik, etkinliği yöntem çağırma işlemine iletmek ve daha sonra işleyicimin işe yaraması için oluşturduğum etkinliğe event.target.name değerini eklemekti. Jsx kodu: 'onChange = {(e) => this._handleChange (e)}' – pherris

+0

Harika! Doğru cevap olarak işaretlemek ister misiniz? –

+0

olurdu ama bu benim sorum değil;) ama yukarı oy verdim! – pherris