2014-10-20 23 views
12

Tôi có một hình thức với 3 nút radio thích sau (tên giả):thử nghiệm một hình thức với jest và Phản ứng TestUtils JS

<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> 

Và Tôi gặp thời gian rất khó khăn cố gắng để kiểm tra onChange và các sự kiện onSubmit .

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

Tôi có một bài kiểm tra như:

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 
}); 

đó làm việc ngoại trừ chức năng (MyComponent.change) mà nên được gọi nhưng nó không phải là.

Tôi cũng có một thử nghiệm cho onSubmit:

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 
}); 

Chú ý: MyComponent.insideDone là một chức năng được gọi bằng chức năng 'làm'.

Điều gì cũng không thành công. Tôi khá chắc chắn rằng vấn đề ở đây là tôi không mô phỏng các sự kiện một cách chính xác. Tuy nhiên, tôi không tìm thấy ví dụ về điều này bằng cách sử dụng Jest và TestUtils từ React.

+0

Tôi đã thử gửi biểu mẫu bằng sự kiện nhấp nhưng không kết thúc ở đâu, nhưng những gì đã giúp giữ chính yếu tố biểu mẫu và gọi TestUtils.Simulate.submit (mẫu) – nimgrg

+0

Đối với chức năng thay đổi, tôi có thể sẽ kiểm tra MyComponent. change.mock.calls.length bằng 1, để kiểm tra xem hàm giả đã được gọi hay chưa. – nimgrg

+0

@nimgrg, mock.calls.length cũng không thành công. Tôi đã cập nhật câu trả lời của mình. Hình như ví dụ cuối cùng, hàm "done" gọi một hàm khác ... và hàm đó được báo cáo là được gọi. –

Trả lời

2

Vấn đề là bạn đang thay thế hàm sau khi bạn đã đưa hàm ban đầu vào React. Biểu thức onSubmit={this.done} là hàm đó và được đặt làm trình xử lý sự kiện. Sau khi hàm render kết thúc, bạn thay thế instance.done nhưng React đã có hàm cũ. Những gì bạn cần làm là thay vì:

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

Điều này đảm bảo rằng xử lý sự kiện luôn gọi phương thức trên dụ (một trong những bạn thay thế). Điều này có tác dụng phụ tốt đẹp của tương lai tương lai với React, vì chúng sẽ ngừng tự động liên kết tất cả các phương thức cho cá thể.

+0

Câu trả lời hay! Sự thay đổi duy nhất tôi phải thực hiện là chuyển sự kiện đến lời gọi phương thức và sau đó thêm event.target.name vào sự kiện mà tôi đã tạo để xử lý của tôi hoạt động đúng. Mã jsx: 'onChange = {(e) => this._handleChange (e)}' – pherris

+0

Tuyệt vời! Bạn có nhớ đánh dấu nó là câu trả lời đúng không? –

+0

nhưng nó không phải là câu hỏi của tôi;) nhưng tôi đã bỏ phiếu! – pherris

Các vấn đề liên quan