redux-form - 如何使用 react-testing-library 测试 redux-form

标签 redux-form react-testing-library

我正在尝试使用 react-testing-library 测试属于 redux-form 一部分的代码。为文本输入字段调用 fireEvent.change 以设置新值我希望应该更新输入的值,但它从未发生过。请在下面找到测试的片段。完整代码可在 https://codesandbox.io/s/redux-form-simple-example-n3820 找到
任何如何使用 react-testing-library 测试 redux-form 的好例子?

...

const firstNameInput = getByTestId(container, "firstName");
const lastNameInput = getByTestId(container, "lastName");

const firstName = "firstName";
const lastName = "lastName";

fireEvent.change(firstNameInput, { target: { value: firstName } });
fireEvent.change(lastNameInput, { target: { value: lastName } });

const submitButton = getByTestId(container, "submitButton");
fireEvent.click(submitButton);

expect(onSubmit).toHaveBeenCalledTimes(1);
expect(onSubmit).toHaveBeenNthCalledWith(firstName, lastName);

最佳答案

问题是你在做fireEvent.click(submitButton)这会触发 click按钮上的事件。您的表单并未监听该事件,而是监听表单上的提交事件。你必须这样做 fireEvent.submit(formElement) .

我注意到的其他一些事情不一定是错误的,但可能会更好。

无需导入 getByTestId您可以从 render 取回它:

// Before
import { render, getByTestId } from '@testing-library/react'
const { container } = render(<Component />)
getByTestId(container, 'foo')

// After
import { render } from '@testing-library/react'
const { getByTestId } = render(<Component />)
getByTestId('foo')

说到 getByTestId你应该把它作为最后的手段。在您的情况下,最好使用 getByLabelText获取输入和 getByText找到按钮。获取 form您可以使用 getByText('Submit').closest('form') .

您应该使用 cleanup 避免测试中出现问题的方法。

关于redux-form - 如何使用 react-testing-library 测试 redux-form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56617679/

相关文章:

javascript - 如何使用react-testing-library测试material ui MenuList组件上的按键事件

html - react 测试库中的父节点

javascript - userEvent.type 仅在包含在 act 中时输入最后一个字符

reactjs - 将 Redux 表单与 React Router 结合使用

javascript - 如何使用按钮和 redux 隐藏/显示单独的表单?

javascript - redux-form Field 和 Checkbox 从对象检查的 React-toolbox 值

javascript - 使用 props.change 更改 redux-form 中输入字段的值

reactjs - 用 Enzyme 测试简单的 Redux-Form(值(value)在哪里??)

reactjs - 我如何使用 Jest 和 React 测试库来测试它?

reactjs - import 'useAuthenticator' from aws-amplify 在 Jest 测试时输出 "TypeError: window.URL.createObjectURL is not a function"