我正在迁移到react-testing-library,并且不知道如何触发此事件并获取更改结果。
我尝试过使用该fireEvent函数触发更改,然后尝试了该rerender函数,但似乎无法正常工作。
fireEvent
rerender
App.js
import React, { useState } from "react"; import logo from "./logo.svg"; import "./App.css"; const options = { DoTheThing: 'DoTheThing', DoOtherThing: 'DoOtherThing', }; function App() { const [action, setAction] = useState(options.DoTheThing); return ( <div className="App"> <header className="App-header"> <form> <fieldset> <label> <input type="radio" name="radio1" value={options.DoTheThing} checked={action === options.DoTheThing} onChange={event => setAction(event.target.value)} /> First </label> <label> <input type="radio" name="radio1" value={options.DoOtherThing} checked={action === options.DoOtherThing} onChange={event => setAction(event.target.value)} /> Second </label> </fieldset> </form> </header> </div> ); } export default App;
App.test.js
import React from 'react'; import { render, cleanup, fireEvent } from 'react-testing-library'; import App from './App'; afterEach(cleanup); it('should change the value ', () => { const {getByLabelText, rerender } = render(<App/>); const second = getByLabelText(/Second/); fireEvent.change(second); rerender(<App/>); expect(document.forms[0].elements.radio1.value).toEqual("DoOtherThing"); });
首先,您不必致电rerender。rerender仅当您希望组件接收不同的道具时才使用。见链接。
每当您调用fireEvent该组件时,它都会像在常规应用程序中一样呈现。
触发change事件是正确的,但是您必须将第二个参数与事件数据一起传递。
change
此示例有效:
import React from "react"; import { render, fireEvent } from "react-testing-library"; test("radio", () => { const { getByLabelText } = render( <form> <label> First <input type="radio" name="radio1" value="first" /> </label> <label> Second <input type="radio" name="radio1" value="second" /> </label> </form> ); const radio = getByLabelText('First') fireEvent.change(radio, { target: { value: "second" } }); expect(radio.value).toBe('second') });