Material-UI TextField onChange 未在测试中调用函数
Material-UI TextField onChange doesn't invoke function in a test
我正在学习 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)
匹配器断言函数被调用了多少次。
最后,您应该使用 getByRole()
而不是 getByTestId()
,因为用户将看到 TextField
(getByRole('textbox')
) 而不是 data-testid
属性只有在检查元素时才能看到的元素。
查看 Which query should I use? 了解更多关于 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);
我正在学习 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)
匹配器断言函数被调用了多少次。
最后,您应该使用 getByRole()
而不是 getByTestId()
,因为用户将看到 TextField
(getByRole('textbox')
) 而不是 data-testid
属性只有在检查元素时才能看到的元素。
查看 Which query should I use? 了解更多关于 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);