Прежде всего, когда вы используете render
метод act-testing-library , вам не нужно беспокоиться об использовании withStyles
или какой-либо оболочки, потому что в конце он отображает компонент как может быть в реальном дом, так что вы можете написать свои тесты в обычном режиме.
Тогда, насколько я понимаю, вы делаете то же самое, что я делал, когда начинал с тестов (это значит, что вы станете хорошими в этом;). Вы пытаетесь смоделировать внутренний метод, и это не лучший подход, которому нужно следовать, потому что вам нужно протестировать реальный метод.
Итак, давайте представим, что у нас есть Register
пользовательский компонент.
ЦСИ / Register.tsx
import ... more cool things
import * as api from './api';
const Register = () => {
const [name, setName] = useState('');
const handleNameChange = (event) => {
setName(event.target.value);
};
const handleSubmit = (event) => {
event.preventDefault();
if (name) {
api.registerUser({ name });
}
};
return (
<form onSubmit={handleSubmit}>
<TextField
id='name'
name='name'
label='Name'
fullWidth
value={name}
onChange={handleNameChange}
/>
<Button data-testid='button' fullWidth type='submit' variant='contained'>
Save
</Button>
</form>
);
}
Компонент довольно прост, это форма с вводом и кнопкой. Мы используем react hooks
для изменения входного значения и на основании того, что мы вызываем или нет api.registerUser
, когда происходит событие handleSubmit
.
Для тестирования компонента первое, что нам нужно сделать, - это метод mock api.registerUser
.
SRC / __ тесты __ / Register.tsx
import * as api from '../api'
jest.mock('../api')
api.registerUser = jest.fn()
Это позволит нам увидеть, вызывается ли этот метод или нет.
Следующее, что нужно сделать, это ... написать тесты, в этом сценарии мы можем протестировать две вещи, чтобы убедиться, что handleSubmit
работает правильно.
- Не звонить
api.registerUser
, если имя пусто .
it('should not call api registerUser method', () => {
const { getByTestId } = render(<Register />)
fireEvent.click(getByTestId('button'))
expect(api.registerUser).toHaveBeenCalledTimes(0)
})
- Позвоните
api.registerUser
, если имя не пусто.
it('should call api registerUser method', () => {
const { getByLabelText, getByTestId } = render(<Register />)
fireEvent.change(getByLabelText('Name'), { target: { value: 'Steve Jobs' }})
fireEvent.click(getByTestId('button'))
expect(api.registerUser).toHaveBeenCalledTimes(1)
})
В этом последнем тесте мы также косвенно тестируем handleNameChange
, потому что мы меняем имя :), поэтому name
не будет пустым и будет вызываться registerUser
.
Пример с withStyles и машинопись находится в этом репо .
Демо-версия здесь .