reactjs - Material-UI TextField onChange 不会在测试中调用函数
问题描述
我正在学习 Jest 和 React 并尝试使用 Material-UI。我写了这个简单的测试只是为了检查事情是如何工作的:
import React from 'react';
import { render, fireEvent, configure} from '@testing-library/react';
import { TextField } from '@material-ui/core';
configure({ testIdAddribute: 'id' });
describe('Testing events', () => {
test('onChange', () => {
const onChangeMock = jest.fn();
const { getByTestId } = render(
<TextField id="test" onChange={onChangeMock} type="text" />
);
fireEvent.change(getByTestId('test', { target: { value: 'foo' } }));
expect(onChangeMock.mock.calls.length).toBe(1);
});
});
但是这个测试失败了:
expect(received).toBe(expected) // Object.is equality
Expected: 1
Received: 0
我在这里不明白什么?
解决方案
getByTestId()
将寻找data-testid
属性,而不是id
. 尝试更改您的代码
<TextField id="test" onChange={onChangeMock} />
到
<TextField inputProps={{ data-testid="test" }} onChange={onChangeMock} />
现在在你的代码中
fireEvent.change(getByTestId('test', { target: { value: 'foo' }})); expect(onChangeMock.mock.calls.length).toBe(1);
在模拟用户的按键操作时,您应该使用@testing-library/user-event
并调用而不是自己手动user.type()
触发事件。onChange
您还可以使用.toHaveBeenCalledTimes(number)
matcher 来断言该函数被调用了多少次。
最后,您应该使用getByRole()
而不是,getByTestId()
因为用户将看到TextField
( getByRole('textbox')
) 而不是data-testid
元素的属性,您只能在检查元素时看到该属性。
请参阅我应该使用哪个查询?了解更多关于 RTL 的哲学。
把它放在一起,你会得到这样的东西:
import { screen } from '@testing-library/dom'
import user from '@testing-library/user-event'
...
const onChangeMock = jest.fn();
render(<TextField onChange={onChangeMock} />);
const input = screen.getByRole('textbox')
user.type(input, 'foo')
expect(onChangeMock).toHaveBeenCalledTimes(3);
推荐阅读
- reactjs - 类型错误:JSX 元素类型 '{} | 空 | undefined' 不是 JSX 元素的构造函数
- java - 如何在 Java 中序列化 ExecutorService?
- haskell - seq 如何评估 Haskell 中的无限列表?
- python - 将html写入csv时的奇怪格式
- reference - sequelize 其中 x2 嵌套相等变量
- android - 如何从 tess-two 中正确提取文本和 boxRects?
- flutter - 不正确使用父数据小部件。扩展的小部件必须放在 flex 小部件内
- php - 您的要求无法解决为一组可安装的软件包。使用作曲家
- jquery - 根据评级更改星颜色
- php - 如果使用 jquery 出现错误,则无法为某些字段显示红色